MongoDB查询基于嵌入文档的计数

Gel*_*Luo 4 count filter mongodb

假设我有:

Order: {_id: ..., items: [...]}
Run Code Online (Sandbox Code Playgroud)

如何过滤商品编号大于5的订单?

And*_*ich 6

您无法根据嵌入集合的大小进行查询,您需要为此类需求创建具有集合大小的字段(mongo db文档):

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

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

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

  • 也知道逆,例如:`db.things.find({a:{$ not:{$ size:0}}});` (3认同)

Rob*_*art 5

您可以使用$ where运算符.

> db.orders.save({Order: {items: [1,2]}})                                                    
> db.orders.save({Order: {items: [1,2,3]}})
> db.orders.find({$where:function() { if (this["Order"]["items"].length > 2) return true; }})
{ "_id" : ObjectId("4d334c9102bcfe450ce52585"), "Order" : { "items" : [ 1, 2, 3 ] } }
Run Code Online (Sandbox Code Playgroud)

$ where的两个缺点是它不能使用索引,BSON对象必须转换为JavaScript对象,因为您在集合中的每个文档上运行自定义JavaScript函数.

因此,对于大型集合来说,$ where可能非常慢.但是,对于临时或很少运行的查询,它非常方便.如果您经常需要运行这样的查询,那么您应该遵循Bugai13的建议,因为您可以索引存储数组大小的密钥.

  • 这也可以写得更短:`.find({$ where:"this.Order.items.length> 2"})` (3认同)