gpt4 book ai didi

java - 如何在mongoquery中展开两个数组

转载 作者:行者123 更新时间:2023-11-29 05:12:45 25 4
gpt4 key购买 nike

我在 mongodb 中有一个这样的集合:

{
"_id" : ObjectId("5490a00879dc6a138dcefb0f"),
"Date" : 20141012,
"Type" : "Twitter",
"Entities" : [
{
"ID" : 2,
"Name" : "test1",
"Sentiment" : {
"Value" : 0.1,
"Neutral" : 12
}
}
],
"Topics" : [
{
"ID" : 1,
"Name" : "Test2",
"Sentiment" : {
"Value" : 0.5,
"Neutral" : 1
}
}
]
}

现在我需要展开主题和实体数组,然后我想按日期分组并对情绪的所有值求和,所以我按如下方式进行:

    DBObject unwind = new BasicDBObject("$unwind", "$Entities"); 
unwind.put("$unwind", "$Topics");
collectionG = db.getCollection("GraphDataCollection");
DBObject groupFields = new BasicDBObject( "_id", "$Date");
groupFields.put("value", new BasicDBObject( "$sum", "$Entities.Sentiment.Value"));
DBObject groupBy = new BasicDBObject("$group", groupFields );
AggregationOutput output = collectionG.aggregate(where,unwind, groupBy);

现在的问题是,对于情绪值的总和,只返回 0,但如果我删除以下行:

    unwind.put("$unwind", "$Topics");

它工作正常,所以我的问题是如何通过一个聚合展开两个数组?

更新:

我改变了我的代码如下:

DBObject unwind = new BasicDBObject("$unwind", "$Entities"); // "$unwind" converts object with array into many duplicate objects, each with one from array
DBObject unwindT = new BasicDBObject("$unwind", "$Topics"); // "$unwind" converts object with array into many duplicate objects, each with one from array
collectionG = db.getCollection("GraphDataCollection");
DBObject groupFields = new BasicDBObject( "_id", "$Date");
groupFields.put("value", new BasicDBObject( "$sum", "$Entities.Sentiment.Value"));
groupFields.put("value1", new BasicDBObject( "$sum", "$Topics.Sentiment.Value"));
DBObject groupBy = new BasicDBObject("$group", groupFields );
List<DBObject> pipeline = Arrays.asList(unwind, unwindT);
DBObject sort = new BasicDBObject("$sort", new BasicDBObject("_id", 1));
AggregationOutput output = collectionG.aggregate(where,unwind,unwindT, groupBy,sort);

但问题是一旦我添加以下行:

groupFields.put("value1", new BasicDBObject( "$sum", "$Topics.Sentiment.Value"));

返回的 value1 和 value 的数字不正确,我认为我没有正确展开。谁能帮忙?

最佳答案

另一种方法,

  • Unwind Entities 数组。
  • Group_id,得到Entitiessum
  • Unwind Topics 数组。
  • Group_id,得到 Topics 的总和。
  • Project 一个字段来显示topicsentities 情绪的总和值(value)观。
  • GroupDate 得到 Netty 。

这样,每个管道中的文档数量最少,并且不会涉及太多的自连接。

聚合代码:

db.collection.aggregate([
{$unwind:"$Entities"},
{$group:{"_id":"$_id",
"Date":{$first:"$Date"},
"Topics":{$first:"$Topics"},
"EntitiesSum":{$sum:"$Entities.Sentiment.Value"}}},
{$unwind:"$Topics"},
{$group:{"_id":"$_id",
"Date":{$first:"$Date"},
"EntitiesSum":{$first:"$EntitiesSum"},
"TopicsSum":{$sum:"$Topics.Sentiment.Value"}}},
{$project:{"_id":0,"Date":1,"EntitiesSum":1,"TopicsSum":1,
"indSum":{$add:["$EntitiesSum","$TopicsSum"]}}},
{$group:{"_id":"$Date",
"EntitiesSentimentSum":{$sum:"$EntitiesSum"},
"TopicsSentimentSum":{$sum:"$TopicsSum"},
"netSentimentSum":{$sum:"$indSum"}}}
])

Java 等价物:

     DBObject unwindEntities = new BasicDBObject("$unwind","$Entities");

DBObject groupSameIdEntities = new BasicDBObject("_id","$_id");
groupSameIdEntities.put("Date", new BasicDBObject("$first","$Date"));
groupSameIdEntities.put("Topics", new BasicDBObject("$first","$Topics"));
groupSameIdEntities.put("EntitiesSum",
new BasicDBObject("$sum","$Entities.Sentiment.Value"));


DBObject unwindTopics = new BasicDBObject("$unwind","$Topics");

DBObject groupSameIdTopics = new BasicDBObject("_id","$_id");
groupSameIdTopics.put("Date", new BasicDBObject("$first","$Date"));
groupSameIdTopics.put("EntitiesSum",
new BasicDBObject("$first","$EntitiesSum"));
groupSameIdTopics.put("TopicsSum",
new BasicDBObject("$sum","$Topics.Sentiment.Value"));

DBObject project = new BasicDBObject("_id",0);
project.put("Date",1);
project.put("EntitiesSum",1);
project.put("TopicsSum",1);
project.put("netSumPerId",
new BasicDBObject("$add",
new String[]{"$EntitiesSum","$TopicsSum"}));

DBObject groupByDate = new BasicDBObject("_id","$Date");
groupByDate.put("EntitiesSentimentSum",
new BasicDBObject("$sum","$EntitiesSum"));
groupByDate.put("TopicsSentimentSum",
new BasicDBObject("$sum","$TopicsSum"));
groupByDate.put("netSentimentSum",
new BasicDBObject("$sum","$netSumPerId"));

AggregationOutput output = col.aggregate(unwindEntities,
new BasicDBObject("$group",
groupSameIdEntities),
unwindTopics,
new BasicDBObject("$group",groupSameIdTopics),
new BasicDBObject("$project",project),
new BasicDBObject("$group",groupByDate));

示例 o/p(有两个文档):

{ "_id" : 2.0141012E7, 
"EntitiesSentimentSum" : 0.30000000000000004 ,
"TopicsSentimentSum" : 1.2 ,
"netSentimentSum" : 1.5}

请将日期字段保存为 ISODate()

关于java - 如何在mongoquery中展开两个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27784890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com