数据库接近5GB。我有以下文件:
{
_id: ..
user: "a"
hobbies: [{
_id: ..
name: football
},
{
_id: ..
name: beer
}
...
]
}
我想要归还拥有超过0个“兴趣爱好”的用户 我试过了
db.collection.find({"hobbies" : { > : 0}}).limit(10)
并且它需要所有RAM而没有结果。
TIA
P.S。 near我发现: “将新字段添加到hande类别大小。这是mongo世界的惯常做法。” 这是真的吗?
答案 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)
如果您只需要找到零爱好,并且如果没有为业余爱好者设置爱好键,请使用EXISTS标志。 为“性能增强”添加“爱好”索引:
db.collection.find({hobbies:{$ exists:true}});
但是,如果爱好零的人有空数组,而有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