【发布时间】:2020-02-18 16:59:47
【问题描述】:
我一直想弄清楚的是在 mongo 查询中执行某种分区(按谓词分割)。我当前的查询如下所示:
db.posts.aggregate([
{"$match": { $and:[ {$or:[{"toggled":false},{"toggled":true, "status":"INACTIVE"}]} , {"updatedAt":{$gte:1549786260000}} ] }},
{"$unwind" :"$interests"},
{"$group" : {"_id": {"iid": "$interests", "pid":"$publisher"}, "count": {"$sum" : 1}}},
{"$project":{ _id: 0, "iid": "$_id.iid", "pid": "$_id.pid", "count": 1 }}
])
这会产生以下输出:
{
"count" : 3.0,
"iid" : "INT456",
"pid" : "P789"
}
{
"count" : 2.0,
"iid" : "INT789",
"pid" : "P789"
}
{
"count" : 1.0,
"iid" : "INT123",
"pid" : "P789"
}
{
"count" : 1.0,
"iid" : "INT123",
"pid" : "P123"
}
到目前为止一切顺利,但后来我意识到对于匹配特定过滤器{"toggled":true, "status":"INACTIVE"} 的文档,我宁愿减少计数 (-1)。 (考虑到最终值也可能是负数。)
有没有办法以某种方式对match 之后的数据进行分区,以确保对两个文档集合执行不同的grouping 操作?
听起来与我正在寻找的东西相似的是
$mergeObjects,或者可能是 $reduce,但我无法从文档示例中获得太多信息。
注意:我能感觉到,处理此问题的一种直接方法是执行两个查询,但我正在寻找一个查询来执行操作。
上述输出的示例文档为:
/* 1 */
{
"_id" : ObjectId("5d1f7******"),
"id" : "CON123",
"title" : "Game",
"content" : {},
"status" : "ACTIVE",
"toggle":false,
"publisher" : "P789",
"interests" : [
"INT456"
],
"updatedAt" : NumberLong(1582078628264)
}
/* 2 */
{
"_id" : ObjectId("5d1f8******"),
"id" : "CON456",
"title" : "Home",
"content" : {},
"status" : "INACTIVE",
"toggle":true,
"publisher" : "P789",
"interests" : [
"INT456",
"INT789"
],
"updatedAt" : NumberLong(1582078628264)
}
/* 3 */
{
"_id" : ObjectId("5d0e9******"),
"id" : "CON654",
"title" : "School",
"content" : {},
"status" : "ACTIVE",
"toggle":false,
"publisher" : "P789",
"interests" : [
"INT123",
"INT456",
"INT789"
],
"updatedAt" : NumberLong(1582078628264)
}
/* 4 */
{
"_id" : ObjectId("5d207*******"),
"id" : "CON789",
"title":"Stack",
"content" : { },
"status" : "ACTIVE",
"toggle":false,
"publisher" : "P123",
"interests" : [
"INT123"
],
"updatedAt" : NumberLong(1582078628264)
}
我期待的结果是
{
"count" : 1.0, (2-1)
"iid" : "INT456",
"pid" : "P789"
}
{
"count" : 0.0, (1-1)
"iid" : "INT789",
"pid" : "P789"
}
{
"count" : 1.0,
"iid" : "INT123",
"pid" : "P789"
}
{
"count" : 1.0,
"iid" : "INT123",
"pid" : "P123"
}
【问题讨论】:
-
您可以尝试使用$facet管道阶段。
-
@prasad_ 考虑回答?同时,我将使用 whoami 提出的示例文档更新问题。
-
我使用方面发布了一个答案。但是,稍后我可能会进一步完善它并更新查询(就代码而言,而不是函数而言)。
标签: mongodb mongodb-query aggregate partitioning mongo-java