在MongoDB 3.0.7中进行嵌套查询

时间:2016-06-16 09:55:51

标签: mongodb mongodb-query

我有属于用户事件子事件,我知道用户的用户名 - 怎么做我得到了一个子事件列表?

这是朝着正确的方向发展吗?还是完全关闭?

db.subevents.find({_id: {$in: 
    db.events.find({_id: {$in:
        db.users.find({"username":"userx"},{_id:1})}},{_id:1})}})

编辑:以下是数据结构的示例:

/* Event */
{
  "_id" : "XjhAqqNBkezKY3mdN",
  "name" : "My event",
  "userId" : "FiKsAAAgBb7cNoPH7"
}
/* Subevent */
{
  "_id" : "WkYAqBXNpJryp7rum",
  "name" : "The subevent",
  "eventId" : "hQXNzX3jbWppbAYFH"
}
/* User */
{
  "_id" : "RTHh5srhLMQp625zF",
  "username" : "userx"
}

2 个答案:

答案 0 :(得分:1)

按照profesor79的建议使用三个不同的调用,我把这个解决方案放在一起,以获得属于用户的所有子事件:

var userIds = db.users.find({"username":"userx"}).map(function(user) { 
  return user._id; 
});
var eventIds= db.events.find({userId: {$in:userIds}}).map(function(event) { 
  return event._id; 
});
db.subevents.find({eventId:{$in:eventIds}});

答案 1 :(得分:0)

唯一的方法是在mongo 3.0.7中进行3次ddifrent调用

  1. GetUSerData
  2. GetEventData
  3. GetSubEventData
  4. 由于你在这里有关系模式 - 这应该很容易。

    您可以通过将subEvents文档嵌入到一个事件文档中来改进模式并删除subEvent集合

    <强> 修改

    /* Event */
    {
        "_id" : "XjhAqqNBkezKY3mdN",
        "name" : "My event",
        "userId" : "FiKsAAAgBb7cNoPH7"
        "subewents" : [{
                "_id" : "WkYAqBXNpJryp7rum",
                "name" : "The subevent",
                "eventId" : "hQXNzX3jbWppbAYFH"
            }, {
                "_id" : "WkYAqBXNpJryp7rum2",
                "name" : "The subevent2",
                "eventId" : "hQXNzX3jbWppbAYFH"
            }, {
                "_id" : "WkYAqBXNpJryp7rum",
                "name" : "The subevent",
                "eventId" : "hQXNzX3jbWppbAYFH"
            }
        ]
    }
    
    /* User */
    {
        "_id" : "RTHh5srhLMQp625zF",
        "username" : "userx"
    }