【问题标题】:Mongo DB: how to select items with nested array count > 0Mongodb:如何选择嵌套数组计数> 0的项目
【发布时间】:2011-09-26 07:05:27
【问题描述】:

数据库接近 5GB。我有如下文件:

{
    _id: ..
    user: "a"
    hobbies: [{
        _id: ..
        name: football
    },
    {
        _id: ..
        name: beer
    }
    ...
    ]
}

我想返回有超过 0 个“爱好”的用户 我试过了

db.collection.find({"hobbies" : { &gt : 0}}).limit(10)

它会占用所有 RAM,但没有结果。

  1. 如何进行此选择?
  2. 以及如何只返回:id、name、count?
  3. c#官方驱动怎么做?

TIA

附: near 我发现: “添加新字段来处理类别大小。这是 mongo 世界的惯例。” 这是真的吗?

【问题讨论】:

    标签: mongodb mongodb-.net-driver


    【解决方案1】:

    在这种特定情况下,您可以使用列表索引来解决您的问题:

    db.collection.find({"hobbies.0" : {$exists : true}}).limit(10)

    这只是确保存在第 0 个元素。您可以通过检查范围末端的现有元素来确保列表短于 n 或长度介于 x 和 y 之间。

    【讨论】:

      【解决方案2】:

      您是否尝试过使用hobbies.length。我还没有测试过,但我相信这是在 mongodb 中查询数组范围的正确方法

      db.collection.find({$where: '(this.hobbies.length > 0)'})
      

      【讨论】:

      • 这行得通 - 但在少量数据上。对于我的任务,我似乎应该维护“计数”变量。
      【解决方案3】:

      您可以(在某种程度上)使用$size 运算符使用逻辑$not 检查一系列数组长度:

      db.collection.find({array: {$not: {$size: 0}}})
      

      【讨论】:

      • 这似乎是对具有非零大小的数组最适用的答案。
      【解决方案4】:

      这有点没错。

      根据说明书

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

      $大小

      $size 运算符匹配任何具有指定数量的数组 元素。以下示例将匹配对象 {a:["foo"]}, 因为该数组只有一个元素:

      db.things.find( { a : { $size: 1 } } );
      

      您不能使用 $size 来查找大小范围(例如:数组 超过 1 个元素)。如果您需要查询范围,请创建一个 添加元素时增加的额外大小字段

      因此您可以检查数组大小为 0,但不能检查“大于 0”之类的内容

      【讨论】:

        【解决方案5】:

        Earlier questions 解释如何处理数组计数问题。尽管在您的情况下,如果 ZERO 确实是您要测试的唯一值,您可以在数组为空时将其设置为 null 并将选项设置为不对其进行序列化,然后您可以测试该字段是否存在。当您想向用户添加爱好时,请记住测试 null 并创建数组。

        对于 #2,如果您添加了计数字段,则可以轻松地从数据库中选择您想要返回的字段并包含计数字段。

        【讨论】:

          【解决方案6】:
          1. 如果您只需要查找零个爱好,并且如果没有为零爱好的人设置爱好键,请使用 EXISTS 标志。 添加一个关于“爱好”的索引以提高性能:

            db.collection.find( { 爱好 : { $exists : true } } );

          2. 但是,如果爱好为零的人的数组为空,而爱好为 1 的人的数组只有 1 个元素,则使用此通用解决方案:

          维护一个名为“hcount”(爱好计数)的变量,并在任何更新中始终将其设置为等于爱好数组的大小。 字段“hcount”的索引 然后,您可以进行如下查询:

           db.collection.find( { hcount : 0 } ) // people with 0 hobbies    
           db.collection.find( { hcount : 5 } ) // people with 5 hobbies
          

          3 - 来自@JohnPs 的回答,“$size”也是一个很好的运算符。 http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-10
            • 2022-07-02
            • 1970-01-01
            • 1970-01-01
            • 2019-05-05
            • 2014-05-31
            相关资源
            最近更新 更多