我有一个以下格式的嵌套文档:
{
_id: "1234567890",
course: {content: [{ id: 1,
children:[{
id: 1111
},
{
id: 2222
}
{
id: 3333
}]
},
{ id: 2,
children:[{
id: 4444
},
{
id: 5555
}
{
id: 6666
}]
}
]}
}
我正在尝试使用Node.js中的以下代码基于id(course.content.children.id)查询子项:
var query = {
'course.content.children.id': quizId,
};
var option = {
'course.content.children.$': 1,
};
db.getEntityWithOption(tablename,query,option,function(data,err){
res.send(data.course.content[0].children);
});
db.getEntityWithOption是db.find()方法之上的包装器方法。当我用quiz id 1调用方法时,上面的代码返回以下完整的数组:`
{ id: 1,
children:[{
id: 1111
},
{
id: 2222
}
{
id: 3333
}]
}
但我只需要id为1111的数组的特定元素而不是competition数组。任何生命救世主都可以告诉我这里我做错了什么。 TIA :)
答案 0 :(得分:0)
你可以从children对象中找到你想要的id,然后发送结果如:
res.send(data.course.content[0].children[0]);
或者如果不在第一个数组元素中,则可以使用for循环找到它然后发送结果。
或者您可以尝试在查询中使用$ elemMatch,但之后您将不得不使用聚合。
在我看来,你不应该使用如此深层次的嵌套文件,因为很难运行复杂的查询。
答案 1 :(得分:0)
$match
> db.course.aggregate([
// unwind the `content` array
{$unwind: '$course.content'},
// unwind the `children` array of `content`
{$unwind: '$course.content.children'},
// match the id with `1111`
{$match: {'course.content.children.id': 1111}}]);
结果:
{ "_id" : ObjectId("56d058d22750efa1f9dc3772"), "course" : { "content" : { "id" : 1, "children" : { "id" : 1111 } } } }
为了满足您的要求,只返回1111
数组,我们可以通过$project
> db.course.aggregate([{$unwind: '$course.content'},
{$unwind: '$course.content.children'},
{$match: {'course.content.children.id': 111}},
{$project: {_id: 0, arr: '$course.content.children'}}]);
结果:
{ "arr" : { "id" : 111 } }
答案 2 :(得分:-1)
您希望按属性进行查询,但不知道content
和children
数组中的哪个子节点拥有所请求的ID。 MongoDB提供positional operator
查询应该以这种方式定义:
var query = {
'course.content.$.children.$.id': quizId,
};