mongodb - 查找其他集合中的值计数
mongodb - Find count of values in other collection
我想知道 collectionTwo 中有多少 "taskId" 以下 collectionOne。
此处,下面的 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);
我想知道 collectionTwo 中有多少 "taskId" 以下 collectionOne。 此处,下面的 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);