0

我有以下架构、博客收藏和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"
        } ]
    }

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

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

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

4

2 回答 2

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}})
于 2012-07-14T22:13:47.660 回答
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}});
于 2012-07-13T22:26:38.593 回答