我正面临一个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获得完成条件的整个对象。