mongodb - 在另一个集合中查找值的数量

8
我想找出以下collectionOne中有多少个"taskId"出现在collectionTwo中。 在这里,以下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”。

添加了collectionTwo的示例文档。在collectionTwo中,"_id"相当于collectionOne中的"taskId"。 - Uday Singh
1个回答

6
使用$lookup运算符在collectionTwo上执行左连接,可以按如下方式获取计数:
db.collectionOne.aggregate([
    { $match: { sId: "DCNrnPeKFrBv" }},
    { $lookup: {
        from: "collectionTwo",
        localField: "data.taskId",
        foreignField: "_id",
        as: "tasksCount"
    } },
    { $addFields: { 
        tasksCount: { $size: "$tasksCount" }
    } }
])

如果使用较旧的 MongoDB 服务器版本(低于 3.2):

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,
        tasksCount: { "$sum": "$count" }
    } }
])

--编辑--

另一种方法是获取collectionOne中所有不同的taskIds列表,并将该列表作为collectionTwo的计数查询,例如:

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

我们能否将其输出更改为 {"count" : 2} -- 只输出计数,而不是两个文档。 { "_id" : 1461982, "count" : 1 } { "_id" : 146108906, "count" : 1 } - Uday Singh
嗨,我需要集合一中所有任务ID的总数。(这是要求)。在上述情况下,它是两个,所以我需要输出为 {"count" : 2}。 - Uday Singh
上面的评论有错别字,我的错。我需要计算集合collectionTwo中所有taskIds的总数(这是要求)。在上述情况中,只有两个来自collectionOne的taskIds出现在collectionTwo中,因此我需要输出为{"count" : 2}。 - Uday Singh
是的,新答案很好。你能否给我一个 MongoDB 版本低于 3.2 的解决方案? - Uday Singh
@user3802384 欢迎更新,提供另一种选择。 - chridam
1
太棒了,非常感谢您提供的解决方案和快速响应。 :) - Uday Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接