MongoDB - 如何从集合中查询嵌入式文档

Posted

技术标签:

【中文标题】MongoDB - 如何从集合中查询嵌入式文档【英文标题】:MongoDB - How to query Embedded Documents from a collection 【发布时间】:2011-05-15 18:22:08 【问题描述】:

Gurus - 我陷入了一种情况,我无法弄清楚如何从以下集合“users”中查询,它有 2 个嵌入文档“signup”和“活动”:


    "appid": 2,
    "userid": 404915,
    "signup": 
        "dt": "2010-12-28",
        "platform": 2 
    ,
    "activity": 
        
            "dt": "2010-12-28",
            "platform": 3,
            "login_count": 8,
            "game_completed": 13 
        ,
        
            "dt": "2010-12-30",
            "platform": 3,
            "login_count": 8,
            "game_completed": 13 
         ,
        
            "dt": "2010-12-31",
            "platform": 3,
            "login_count": 8,
            "game_completed": 13 
         
    
,"appid":2,"userid":404915...

我需要查询:

在 Date 和 Date+7 之间注册并在 Date 内登录的用户的唯一登录名

然后:

在Date和Date+7之间注册,在Date+7和Date+14之间登录的用户的唯一登录

请指导我如何在任何示例/示例中实现这一点?基于此将非常有帮助:-)

非常感谢!

【问题讨论】:

"activity" 怎么可能是一个字典而不是一个列表? 【参考方案1】:

这是您获得第一个查询结果的方式:

var start = new Date(2010, 11, 25);
var end = new Date(2010, 12, 1);

db.users.distinct("userid", "signup.dt" : $gte: start, $lte: end,
      "activity" : "$elemMatch" :  dt: $gte: start, $lte: end);

第二个是在活动结束后的日期加上开始日期和结束日期的7天。

【讨论】:

这里还有一个问题,我看了RockMongo,有添加activity子文档后添加的keys:"activity":"0":"dt":"2010-12-30 "...,"1": "dt": "2010-12-29"... ... 上面的查询能解决这个问题吗? 如果子文档以这种方式构建,我认为它不会起作用。如果密钥在子文档中,它应该可以工作:“activity”:[“key”:“0”,“dt”:“2010-12-30”...,“key”:“1 ", "dt": "2010-12-29"... ] ...

以上是关于MongoDB - 如何从集合中查询嵌入式文档的主要内容,如果未能解决你的问题,请参考以下文章

如何在嵌入式数组mongodb中查询嵌入式文档

用于嵌入式集合的 MongoDB 首选模式。文档与数组

查询spring数据mongodb中嵌入文档的数组

用 MongoDB 嵌入集合(子文档数组)违反 REST?

用 MongoDB 嵌入集合(子文档数组)违反 REST?

如何计算嵌入式mongodb文档中的键数