mongodb - 查找其他集合中的值的计数

时间:2016-08-19 07:28:25

标签: mongodb mongodb-query aggregation-framework mongodb-aggregation

我想在collectionTwo中找到以下collectionOne中有多少“taskId”。 这里,下面collectionOne中的“taskId”嵌入在文档中的数组中。

另外,让我知道执行此操作的不同方法(如果可能)。

db.collectionOne.find({"sId":"DCNrnPeKFrBv" }).pretty()
{
        "_id" : "sX8o7mJhebs",
        "sId" : "DCNrnPeKFrBv",
        "data" : [
                {
                        "oId" : "7SycYQ",
                        "taskId" : 146108906
                },
                {
                        "oId" : "7SycYQ",
                        "taskId" : 14623846
                },
                {
                        "oId" : "fANQ",
                        "taskId" : 1461982
                },
                {
                        "oId" : "fAeNQ",
                        "taskId" : 131732
                },
                {
                        "oId" : "t6AF5yn",
                        "taskId" : 197681
                }
        ]
}



> db.collectionTwo.find().pretty().limit(2)
{
        "_id" : 146108906,
        "oId" : "7SycYQ",
        "name" : "ABC"
}
{
        "_id" : 1461982,
        "oId" : "fANQ",
        "name" : "XYZ"
}

在collectionTwo中,“_ id”相当于collectionOne的“taskId”。

1 个答案:

答案 0 :(得分:1)

使用 $lookup 运算符在collectionTwo上进行左连接,您可以按如下方式获取计数:

db.collectionOne.aggregate([
    { "$unwind": "$data" },
    {
        "$lookup": {
            "from": "collectionTwo",
            "localField": "data.taskId",
            "foreignField": "_id",
            "as": "tasks"
        }
    },
    { "$unwind": "$tasks" },
    {
        "$group": {
            "_id": "$tasks._id",
            "count": { "$sum": 1 }
        }
    },
    {
        "$group": {
            "_id": null,
            "total": { "$sum": "$count" }
        }
    }
])

- 的修改 -

另一种方法是获取collectionOne中所有不同taskIds的列表,并将该列表用作collection上的count查询,例如。

var taskIds = db.collectionOne.distinct("data.taskId");
var tasksCount = db.collectionTwo.count({ "_id": { "$in": taskIds } });
printjson(taskIds);
printjson(tasksCount);