如何根据MongoDB中嵌入文档的长度进行过滤?

时间:2012-05-30 00:25:44

标签: mongodb mongoose

例如,在这里给出BlogPost / Comments模式:

http://mongoosejs.com/

如何查找超过五条评论的所有帖子?我尝试了一些类似

的方法
where('comments').size.gte(5)

但是我的语法

被绊倒了

3 个答案:

答案 0 :(得分:4)

MongoDb不支持使用大小运算符(Link)的范围查询。他们建议您创建一个单独的字段,以包含您自己增加的列表大小。

  

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

答案 1 :(得分:1)

请注意,对于某些查询,仅使用(n)或条件列出您想要或排除的所有计数可能是可行的。

在您的示例中,以下查询将为所有文档提供超过5条注释(使用标准mongodb语法,而不是mongoose):

db.col.find({"comments":{"$exists"=>true}, "$nor":[{"comments":{"$size"=>4}}, {"comments":{"$size"=>3}}, {"comments":{"$size"=>2}}, {"comments":{"$size"=>1}}, {"comments":{"$size"=>0}}]})

显然,这是非常重复的,所以它只适用于小边界,如果有的话。按照mongodb文档的建议,保持一个单独的计数变量通常是更好的解决方案。

答案 2 :(得分:0)

速度很慢,但您也可以使用$where子句:

db.Blog.find({$where:"this.comments.length > 5"}).exec(...);