通过mongodb中的子收集计数进行选择

时间:2012-05-06 12:50:36

标签: mongodb mongoid

我有一个像这样的mongo对象:

{
    "_id" : ObjectId("4fa291baf5de89b89cb03f4e"),
    "examples" : [
        "!@3123123123", "23423fd34", "23423we4234"
    ]
}

我需要选择包含> = 3个示例的所有对象。 这样做的正确方法是什么?

感谢。

2 个答案:

答案 0 :(得分:3)

维护专用计数器变量作为文档的一部分,并使用此变量执行相关查询。

答案 1 :(得分:1)

有不同的方法可以做到这一点。如果你的收藏不是很大,只有几千个条目,那么你可以这样做:

User.all.select {|user| !user['examples'].nil? and user['examples'].count >= 3}

将集合中的所有条目加载到内存中,并使用Ruby本机功能进行选择。如果集合中有1000万个条目,则不应该这样做。

由于MongoDB 2.2+你可以这样做:

User.collection.find({'examples.2' => {'$exists' => true}})

这将返回“示例”子集合中至少包含3个元素的所有用户。计数从0开始,元素在子集合中的位置。 我们在VersionEye使用此功能来识别不关注任何内容的用户。