Mongodb:使用嵌套数组中的值进行查询

时间:2012-07-13 22:15:15

标签: arrays mongodb

我有以下架构,博客集合& friendscoll如下

blogpostcollection
    {
      "_id" : ObjectId("4fff0bf18bf0d19c4f1a5826"),
      "author" : "joe",
      "text" : "Here is the text...",
      "userid" : 0
    }
    {
      "_id" : ObjectId("4fff0bf18bf0d19c4f1a5827"),
      "author" : "blake",
      "text" : "Here is the text...",
      "userid" : 1
    }
    {
      "_id" : ObjectId("4fff0bf18bf0d19c4f1a5828"),
      "author" : "joe",
      "text" : "Here is the text...",
      "userid" : 2
    }

myfriendscoll
    {
      "myid": 999,
      "data": [
        {
          "uid": 1, 
          "name": "Raul"
        }, 
        {
          "uid": 3, 
          "name": "John K"
        } ]
    }

我想在myposndscoll集合中找到blogpostcollection中的所有文档,其中userid作为uid存在。 所以实际上就像..

var user = db.myfriendscoll.findOne({"myid" : 999}, {"data.uid": 1});
db.blogpostcollection.find( {"userid" : {$in : user.data.uid}});

这不起作用,但是有办法让它起作用吗?...谢谢!

2 个答案:

答案 0 :(得分:1)

如果您使用的是开发版本2.1,或者一旦发布后转移到2.2,您可以使用聚合框架从第一个查询中获取您想要的格式:

var ret=db.myfriendscoll.aggregate([
             {$match:{"myid" : 999}},
             {$project:{_id:0,uid:"$data.uid"}}
]);
var uids=ret.result[0].uid;
db.blogpostcollection.find({userid:{$in:uids}})

答案 1 :(得分:0)

您需要将实际的uid值提取到数组中以与$ in一起使用。试试这个:

var user = db.myfriendscoll.findOne({"myid" : 999}, {"data.uid": 1});
var uids = user.data.map(function(v){ return v.uid });
db.blogpostcollection.find( {"userid" : {$in : uids}});