2011-09-26 41 views
7

数据库接近5GB。我有这样的文件:Mongo DB:如何选择嵌套数组数> 0

{ 
    _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我找到了: “为hande分类大小添加新字段,这是mongo世界的惯例。” 这是真的吗?

回答

8

您是否尝试过使用hobbies.length。我没有测试过这一点,但我相信这是查询数组范围MongoDB中

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

此工作的 - 但对少量的数据。对于我的任务,似乎我应该保持“计数”变量。 – 1gn1ter

1

Earlier questions说明如何处理数组计数问题。虽然在你的情况下,如果ZERO真的是你想要测试的唯一值,你可以在数组为空时将数组设置为null,并设置不序列化它的选项,然后可以测试该字段的存在。记住要测试null,并在想要为用户添加兴趣时创建数组。

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

2

这是有些错误。

根据手册

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

$大小

的$大小操作者 元素的指定数量的任何阵列相匹配。由于该阵列仅具有一个元素, :

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

不能使用$尺寸找到一个尺寸范围(:下面的示例将匹配对象{[“foo”的]一个}例如:具有多于1个元素的数组 )。如果您需要查询的范围内,当你添加元素

所以,你可以检查数组大小为0,但不喜欢的事情“大于0”

创建你增加一个 额外的大小字段
0
  1. 如果您只需要找到零兴趣爱好,并且如果没有为没有爱好的人设置兴趣密钥,请使用EXISTS标志。 在“业余爱好”上添加索引以提升性能:

    db.collection。find({hobbies:{$ 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回答,“$大小”也是出于这个目的,一个好的运营商。 http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

16

在这种特殊情况下的正确方法,你可以用列表索引来解决问题:

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

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

7

可以(排序的)检查一系列阵列的长度与使用逻辑$not$size操作者:

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

对于具有非零大小的数组,这似乎是最适用的答案。 – Roddy