【问题标题】:Querying Nested List Existence in MongoMongo中查询嵌套列表是否存在
【发布时间】:2012-01-24 20:57:01
【问题描述】:

我在 Mongo 中有一个文档,其结构如下:

{ 
    "_id" : ObjectId("4eea7237d0ba3a04f20008fb"), 
    "code" : "b2677c2809c844cc9d7e3e4ff8d95b46", 
    "city_id" : 4, 
    "datetime" : ISODate("2011-12-13T18:41:44.062Z"), 
    "plays" : [     
        {   
          "play_id" : 717224,   
          "clicks" : [ ],   
          "order" : 1,  
          "mysql_id" : 145
        }

我想查询 play.clicks 属性为非空列表的文档。我试过没有运气存在。我认为这样的事情可能会起作用:

 db.collection.find({plays.clicks.0: {$exists:true}})

但我相信这只会返回 play 数组中第一个元素包含非空点击列表的文档。

有没有想过如何完成这项工作?

谢谢

【问题讨论】:

    标签: javascript mongodb nosql


    【解决方案1】:

    将列表的大小保存为单独的属性(例如num_plays)。然后可以查询num_plays大于0的文档:

    【讨论】:

    • 我可以做到这一点。从阅读的角度来看,这可能允许最快的查询。
    【解决方案2】:

    没有测试,但我认为你想要的查询是

    { "plays.clicks" : { "$size" : 0 } }
    

    http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

    【讨论】:

    • 是的,如果我想返回列表大小为 0 的所有文档,那很好。不幸的是,我想要相反的,这似乎不可能。
    【解决方案3】:

    db.collection.find({plays.clicks.0: {$exists:true}})

    是正确的语法,但是由于plays 是一个列表,因此查询将匹配任何在plays 中点击的文档。无法以这种方式检索子元素的 Array 子集 [1]。子/虚拟收藏有一张票[2]

    [1]http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

    [2]https://jira.mongodb.org/browse/SERVER-828

    【讨论】:

    • 谢谢罗斯,这可能是最好的答案(尽管额外的非规范化建议是一个合理的选择)。
    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多