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

标签 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”。

最佳答案

使用 $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 中所有不同 taskId 的列表,并将该列表用作 collectionTwo 上的计数查询,例如

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

关于mongodb - 在其他集合中查找值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39033388/

相关文章:

node.js - Mongoose 在日期范围内聚合

node.js - Mongodb - 未知的顶级运算符 : $elemMatch"

c - mongo 中 $push 的问题

node.js - 是否可以在查询中更新集合中的值?

javascript - Mongodb 按 dbref 字段分组

包含 "@"的 MongoDB 密码

mongodb - 对我的案例MongoDB模式设计的看法

mongodb - $lookup 查找数组中的 ObjectId

mongodb - 按数组元素比较查找

Mongodb 在子数组中查找