Mongodb:如何选择嵌套数组计数> 0

时间:2011-09-26 07:05:27

标签: mongodb mongodb-.net-driver

数据库接近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#官方驱动程序?
  4. TIA

    P.S。 near我发现: “将新字段添加到hande类别大小。这是mongo世界的惯常做法。” 这是真的吗?

6 个答案:

答案 0 :(得分:16)

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

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

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:7)

您可以(使用逻辑$size $not db.collection.find({array: {$not: {$size: 0}}}) 运算符检查一系列数组长度:

{{1}}

答案 3 :(得分:2)

这有点真实。

根据手册

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

  

$大小

     

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

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

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

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

之类的内容

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

  1. 如果您只需要找到零爱好,并且如果没有为业余爱好者设置爱好键,请使用EXISTS标志。 为“性能增强”添加“爱好”索引:

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

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

  3. 维护名为“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