mongo 查询中的减法不起作用?
subtraction in mongo query does not work?
我有一个合集如下:
{
"_id" : ObjectId("5491d65bf315c2726a19ffe0"),
"tweetID" : NumberLong(535063274220687360),
"tweetText" : "19 RT Toronto @SunNewsNetwork: WATCH: When it comes to taxes, regulations, and economic freedom, is Canada more \"American\" than America? http://t.co/D?",
"retweetCount" : 1,
"source" : "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
"Date" : ISODate("2014-11-19T04:00:00.000Z"),
"Added" : ISODate("2014-11-19T04:00:00.000Z"),
"tweetLat" : 0,
"tweetLon" : 0,
"url" : "http://t.co/DH0xj0YBwD ",
"sentiment" : 18,
"quality" : 0.4,
"intensity" : 10,
"happiness" : 0,
"calmness" : 0,
"kindness" : 0,
"sureness" : 0,
"Hashtags" : [
"harp",
"nknkn"
],
"authorID" : NumberLong(49067869),
"authorName" : "Fran Walker",
"authorFollowers" : 93,
"authorFollowing" : 133,
"authorFavourites" : 50,
"authorTweets" : 13667,
"authorVerified" : false,
"screenName" : "snickeringcrow",
"profileImageURL" : "http://pbs.twimg.com/profile_images/2180546952/smilinkitty.asp_-_Copy_normal.jpg",
"profileLocation" : "",
"timezone" : "Eastern Time (US & Canada)",
"gender" : "M",
"Entities" : [
{
"id" : 6,
"name" : "Harper, Stephen",
"frequency" : 0,
"partyId" : 6
}
],
"Topics" : [
{
"id" : 8,
"name" : "Employment",
"frequency" : 1,
"Subtopics" : [
{
"id" : 34,
"name" : "Economic",
"frequency" : 1
}
]
},
{
"id" : 11,
"name" : "Economy",
"frequency" : 1,
"Subtopics" : [
{
"id" : 43,
"name" : "Economic",
"frequency" : 1
}
]
}
]
}
我正在尝试按日期分组,并得到每组的情绪总和除以(每组中的项目数 -1)。如您所见,因为那个 -1 我不能使用 mongo 的 avg 函数,所以我必须手动完成,如下所示:
DBCollection collectionG;
collectionG = db.getCollection("TweetCachedCollection");
ArrayList<EntityEpochData> results = new ArrayList<EntityEpochData>();
List<DBObject> stages = new ArrayList<DBObject>();
ArrayList<DBObject> andArray = null;
DBObject groupFields = new BasicDBObject("_id", "$Added");
groupFields.put("value",
new BasicDBObject("$sum", "$" + sType.toLowerCase()));
groupFields.put("count", new BasicDBObject("$sum", 1));
DBObject groupBy = new BasicDBObject("$group", groupFields);
stages.add(groupBy);
DBObject project = new BasicDBObject("_id", 0);
project.put("count", new BasicDBObject("$subtract", new Object[] {
"$count", 1 }));
project.put("value", new BasicDBObject("$divide", new Object[] {
"$value", "$count" }));
project.put("Date", "$_id");
stages.add(new BasicDBObject("$project", project));
DBObject sort = new BasicDBObject("$sort", new BasicDBObject("Date", 1));
stages.add(sort);
AggregationOutput output = collectionG.aggregate(stages);
现在一切正常,除了:
假设计数是 3,但如果我添加它,我希望计数的数字是 2,它是在减法之后,但是当涉及到下一行时,计数仍然是指 3。
有关更多解释,例如总和为 6 且计数为 3,我想要总和/(count-1) return 2 但它 returns 3!!!!
所以这行 returns 2:
project.put("count",new BasicDBObject("$subtract", new Object[] {"$count", 1 }));
但下一行仍然将 6 除以 3 而不是 2:
project.put("value", new BasicDBObject("$divide", new Object[] {
"$value", "$count" }));
最后一行的计数似乎仍然指的是计数的旧值而不是更新后的值...
谁能帮帮我?
更新:
我自己觉得如果我先做减法再做除法就可以了但是我不知道怎么做?
您需要对 $project
对象稍作修改。您需要使用从 count
减去 1
获得的对象,而不是使用 count
.
的先前值
DBObject project = new BasicDBObject("_id", 0);
DBObject countAfterSubtraction = new BasicDBObject("$subtract",
new Object[] {"$count", 1});
DBObject value = new BasicDBObject("$divide",
new Object[] {"$value",countAfterSubtraction});
project.put("value", value);
project.put("Date", "$_id");
stages.add(new BasicDBObject("$project", project));
以上代码适用于 records >= 2
的群组。如果只有一个记录的单个组,减法后的计数将为零,导致 除以零 错误。
所以你可以修改你的代码,包含一个$cond,检查减法后的计数是否为0
,如果是,则默认为1
,否则保留 count
.
的减去值
DBObject project = new BasicDBObject("_id", 0);
DBObject countAfterSubtraction = new BasicDBObject("$subtract",
new Object[] {"$count", 1});
DBObject eq = new BasicDBObject("$eq",
new Object[]{countAfterSubtraction,0});
DBObject cond = new BasicDBObject("$cond",
new Object[]{eq,1,countAfterSubtraction});
DBObject value = new BasicDBObject("$divide",
new Object[] {"$value",cond});
project.put("value", value);
project.put("Date", "$_id");
stages.add(new BasicDBObject("$project", project));
我有一个合集如下:
{
"_id" : ObjectId("5491d65bf315c2726a19ffe0"),
"tweetID" : NumberLong(535063274220687360),
"tweetText" : "19 RT Toronto @SunNewsNetwork: WATCH: When it comes to taxes, regulations, and economic freedom, is Canada more \"American\" than America? http://t.co/D?",
"retweetCount" : 1,
"source" : "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
"Date" : ISODate("2014-11-19T04:00:00.000Z"),
"Added" : ISODate("2014-11-19T04:00:00.000Z"),
"tweetLat" : 0,
"tweetLon" : 0,
"url" : "http://t.co/DH0xj0YBwD ",
"sentiment" : 18,
"quality" : 0.4,
"intensity" : 10,
"happiness" : 0,
"calmness" : 0,
"kindness" : 0,
"sureness" : 0,
"Hashtags" : [
"harp",
"nknkn"
],
"authorID" : NumberLong(49067869),
"authorName" : "Fran Walker",
"authorFollowers" : 93,
"authorFollowing" : 133,
"authorFavourites" : 50,
"authorTweets" : 13667,
"authorVerified" : false,
"screenName" : "snickeringcrow",
"profileImageURL" : "http://pbs.twimg.com/profile_images/2180546952/smilinkitty.asp_-_Copy_normal.jpg",
"profileLocation" : "",
"timezone" : "Eastern Time (US & Canada)",
"gender" : "M",
"Entities" : [
{
"id" : 6,
"name" : "Harper, Stephen",
"frequency" : 0,
"partyId" : 6
}
],
"Topics" : [
{
"id" : 8,
"name" : "Employment",
"frequency" : 1,
"Subtopics" : [
{
"id" : 34,
"name" : "Economic",
"frequency" : 1
}
]
},
{
"id" : 11,
"name" : "Economy",
"frequency" : 1,
"Subtopics" : [
{
"id" : 43,
"name" : "Economic",
"frequency" : 1
}
]
}
]
}
我正在尝试按日期分组,并得到每组的情绪总和除以(每组中的项目数 -1)。如您所见,因为那个 -1 我不能使用 mongo 的 avg 函数,所以我必须手动完成,如下所示:
DBCollection collectionG;
collectionG = db.getCollection("TweetCachedCollection");
ArrayList<EntityEpochData> results = new ArrayList<EntityEpochData>();
List<DBObject> stages = new ArrayList<DBObject>();
ArrayList<DBObject> andArray = null;
DBObject groupFields = new BasicDBObject("_id", "$Added");
groupFields.put("value",
new BasicDBObject("$sum", "$" + sType.toLowerCase()));
groupFields.put("count", new BasicDBObject("$sum", 1));
DBObject groupBy = new BasicDBObject("$group", groupFields);
stages.add(groupBy);
DBObject project = new BasicDBObject("_id", 0);
project.put("count", new BasicDBObject("$subtract", new Object[] {
"$count", 1 }));
project.put("value", new BasicDBObject("$divide", new Object[] {
"$value", "$count" }));
project.put("Date", "$_id");
stages.add(new BasicDBObject("$project", project));
DBObject sort = new BasicDBObject("$sort", new BasicDBObject("Date", 1));
stages.add(sort);
AggregationOutput output = collectionG.aggregate(stages);
现在一切正常,除了:
假设计数是 3,但如果我添加它,我希望计数的数字是 2,它是在减法之后,但是当涉及到下一行时,计数仍然是指 3。
有关更多解释,例如总和为 6 且计数为 3,我想要总和/(count-1) return 2 但它 returns 3!!!! 所以这行 returns 2:
project.put("count",new BasicDBObject("$subtract", new Object[] {"$count", 1 }));
但下一行仍然将 6 除以 3 而不是 2:
project.put("value", new BasicDBObject("$divide", new Object[] {
"$value", "$count" }));
最后一行的计数似乎仍然指的是计数的旧值而不是更新后的值...
谁能帮帮我?
更新:
我自己觉得如果我先做减法再做除法就可以了但是我不知道怎么做?
您需要对 $project
对象稍作修改。您需要使用从 count
减去 1
获得的对象,而不是使用 count
.
DBObject project = new BasicDBObject("_id", 0);
DBObject countAfterSubtraction = new BasicDBObject("$subtract",
new Object[] {"$count", 1});
DBObject value = new BasicDBObject("$divide",
new Object[] {"$value",countAfterSubtraction});
project.put("value", value);
project.put("Date", "$_id");
stages.add(new BasicDBObject("$project", project));
以上代码适用于 records >= 2
的群组。如果只有一个记录的单个组,减法后的计数将为零,导致 除以零 错误。
所以你可以修改你的代码,包含一个$cond,检查减法后的计数是否为0
,如果是,则默认为1
,否则保留 count
.
DBObject project = new BasicDBObject("_id", 0);
DBObject countAfterSubtraction = new BasicDBObject("$subtract",
new Object[] {"$count", 1});
DBObject eq = new BasicDBObject("$eq",
new Object[]{countAfterSubtraction,0});
DBObject cond = new BasicDBObject("$cond",
new Object[]{eq,1,countAfterSubtraction});
DBObject value = new BasicDBObject("$divide",
new Object[] {"$value",cond});
project.put("value", value);
project.put("Date", "$_id");
stages.add(new BasicDBObject("$project", project));