MongoDB项目计数大于2的文档[重复]

Posted

技术标签:

【中文标题】MongoDB项目计数大于2的文档[重复]【英文标题】:MongoDB project the documents with count greater than 2 [duplicate] 【发布时间】:2016-02-13 11:55:01 【问题描述】:

我有一个类似的收藏


    "_id": "201503110040020021",
    "Line": "1", // several documents may have this Line value
    "LineStart": ISODate("2015-03-11T06:49:35.000Z"),
    "SSCEXPEND": [
            "Secuence": 10,
            "Title": 1,
        ,
        
            "Secuence": 183,
            "Title": 613,
        ,
        ...
    ],

 
    "_id": "201503110040020022",
    "Line": "1", // several documents may have this Line value
    "LineStart": ISODate("2015-03-11T06:49:35.000Z"),
    "SSCEXPEND": [
            "Secuence": 10,
            "Title": 1,
        ,

    ],


SSCEXPEND 是一个数组。如果计数大于或等于 2,我正在尝试计算 SSC 数组和项目的大小。我的查询是这样的

db.entity.aggregate(
   [
      
         $project: 
            SSCEXPEND_count: $size: "$SSCEXPEND"
         
      ,
      
        $match: 
            "SSCEXPEND_count2": $gte: ["$SSCEXPEND_count",2]
         
      
   ]
)

我希望输出只是数组大小大于 2 的第一个文档。

项目部分工作正常,我可以得到计数,但我只需要投影那些计数大于或等于 2 但我的匹配部分不起作用的部分。谁能指导我哪里出错了?

【问题讨论】:

【参考方案1】:

您需要投影其他字段,并且您的 $match 管道只需要对新创建的字段进行查询,以根据数组大小过滤文档。像下面这样的东西应该可以工作:

db.entity.aggregate([
    
        "$project": 
            "Line": 1,
            "LineStart": 1, "SSCEXPEND": 1,
            "SSCEXPEND_count":  "$size": "$SSCEXPEND" 
         
    ,
    
        "$match": 
            "SSCEXPEND_count":  "$gte": 2 
         
    
])

样本输出

/* 0 */

    "result" : [ 
        
            "_id" : "201503110040020021",
            "Line" : "1",
            "LineStart" : ISODate("2015-03-11T06:49:35.000Z"),
            "SSCEXPEND" : [ 
                
                    "Secuence" : 10,
                    "Title" : 1
                , 
                
                    "Secuence" : 183,
                    "Title" : 613
                
            ],
            "SSCEXPEND_count" : 2
        
    ],
    "ok" : 1

【讨论】:

如果你想使用聚合,你应该使用$redact @user3100115 如果你还想使用聚合,你“应该”使用$match。无需强制函数来确定是否存在最低级别的数组元素。 $redact 仍然强制进行集合扫描,就像 $where 所做的那样。【参考方案2】:

这实际上是一个非常简单的查询,其中诀窍是使用“点符号”的属性来测试数组。您真正需要询问的是数组索引为2 $exists 的文档,这意味着该数组必须包含3 或更多元素:

db.entity.find( "SSCEXPEND.2":  "$exists": true  )

这是最快的方法,甚至可以使用索引。聚合运算无需计算。

【讨论】:

一个优雅的解决方案! @DmytroShevchenko 然而(“出于某种未知原因”)OP选择先接受这一点,然后放弃。这是人们“应该”遵循的有效方法,正如我还指出的那样,标记的副本具有最高投票的答案,说的是完全相同的事情(我在发布时不知道,但后来发现)。一个简单的原则是,如果n-1 元素确实存在,那么数组必须至少具有该长度。有趣的是,在重复的问题上还发布了另一个答案,表明接受的尺寸计算相同。但这显然是错误的。 这对于包含 3 个或更多元素的数组来说是一个很好的答案,但是,我该如何做相反的事情呢?我的意思是如果想要少于 3 个元素。

以上是关于MongoDB项目计数大于2的文档[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb聚合数组大小大于匹配[重复]

Mongodb聚合数组大小大于匹配[重复]

mongodump按日期导出数据

MongoDB

MongoDB安装和入门

mongodb二进制安装文档