Mongo DB聚合:数组大小大于匹配

13

我有一个收藏品,其中投资是 mongodb 文档内的数组。现在,我正在使用汇总来过滤投资长度超过 5 倍的结果,然后使用匹配查询进行下一步处理。

 Collection{
 _id:000000
 --------------------- 
 "investments" : [      {
          hhhhhhhhhhhhhh 
         },
         {
           hhhhhhhhhhhhhh 
          } }]
-----------------
我写的匹配查询如下,但不起作用。有什么建议吗:

我写的匹配查询如下,但不起作用。有什么建议吗:

db.companies.aggregate( [
    { $match:  {"founded_year" : 2004}, 
  {  "investments" : {$size: : { $gte: 5 } } }  },
----------------------------------
--------------------------------
]}

1
看看这个链接是否有帮助。 - s7vr
2
你可以在3.6中使用 db.companies.find({"$expr":{"$and":[{"$eq":["$founded_year", 2004]}, {"$gte":[{"$size":"$investments"}, 5]}]}}) - s7vr
1个回答

44

使用aggregate

db.companies.aggregate([
  { $match:  { "founded_year":2004 } },
  { $project: { founded_year:1,  
                moreThanFive: { $gt: [ {$size: "$external_links" }, 5 ] } } },
  { $match: { moreThanFive : true }} ,
])

您需要执行以下操作:
1. 包含一个$project阶段,以查找投资数量(数组的size),并检查是否大于5。
2. 然后再执行另一个$match阶段,过滤那些moreThanFive等于true的项。

使用find

db.companies.find({'investments.5': {$exists: true}})

您询问投资数组中的第6个位置是否存在。


7
看起来你的第二个选项(使用find)在聚合中的匹配操作也可以工作。由于它看起来像是取消引用,所以我想它应该非常快。对于聚合,你还会推荐使用第一种方法吗? - bachinblack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接