在节点

时间:2016-02-26 13:09:14

标签: node.js mongodb

我有一个以下格式的嵌套文档:

{
     _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 :)

3 个答案:

答案 0 :(得分:0)

你可以从children对象中找到你想要的id,然后发送结果如:

res.send(data.course.content[0].children[0]);

或者如果不在第一个数组元素中,则可以使用for循环找到它然后发送结果。

或者您可以尝试在查询中使用$ elemMatch,但之后您将不得不使用聚合。

在我看来,你不应该使用如此深层次的嵌套文件,因为很难运行复杂的查询。

答案 1 :(得分:0)

请使用aggregation$unwind

审核$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)

您希望按属性进行查询,但不知道contentchildren数组中的哪个子节点拥有所请求的ID。 MongoDB提供positional operator

查询应该以这种方式定义:

var query = {
  'course.content.$.children.$.id': quizId,
};