MongoDB -只获取那些与id数组匹配的文档



我正面临一个Mongoose模式集合的问题,它有一个嵌套的对象数组。集合名称为Sprint,其中包含tasks作为子文档,即对象数组。

模式是这样的。

// document 1
{
_id: ObjectId("6138e5866b19971ba8a60851"),
tasks: [
{
_id: ObjectId("6138e5ad6b19971ba8a60852"),
taskName: "Hello"
},
{
_id: ObjectId("6138e5ad6b19971ba8a543252"),
taskName: "Hello 2"
}
]
},
// document 2
{
_id: ObjectId("6138e5866b19971ba8a76851"),
tasks: [
{
_id: ObjectId("6138e5ad6f19971ba8a60852"),
taskName: "World"
},
{
_id: ObjectId("6138e5ad6sd19971ba8a543252"),
taskName: "World 2"
}
]
}

我的目标是在一个与给定的ids匹配的数组中只获得那些tasks对象。

我的taskIds数组是这样的。

const taskIds = ["6138e5ad6b19971ba8a60852", "6138e5ad6b19971b568a60852"];

,我使用$in比较运算符来获得这些任务。

const query =  {"tasks._id": {$in: taskIds}};
const tasks = await Sprint.find(query);
console.log(tasks);

但是我得到的数据是整个文档的数组,其tasks在对象数组中。我仍然不知道如何在与ids匹配的数组中只获得那些任务。

如果我理解正确,你可以使用这个查询:

  • $unwind解构数组
  • $match按您的标准。
  • $group使用null作为_id,因为你想获得所有tasks的值。
  • 和(可选)$project不显示_id
db.collection.aggregate([
{
"$unwind": "$tasks"
},
{
"$match": {
"tasks._id": {
"$in": [
"6138e5ad6b19971ba8a60852",
"6138e5ad6b19971b568a60852"
]
}
}
},
{
"$group": {
"_id": null,
"tasks": {
"$push": "$tasks"
}
}
},
{
"$project": {
"_id": 0
}
}
])

例子

另外,解释为什么使用查询mongo显示整个对象是因为使用该查询,您告诉mongo"五个文档",其中tasks数组中的_id字段在此数组中"。并且mongo获得完成条件的整个对象。

最新更新