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的文档[重复]的主要内容,如果未能解决你的问题,请参考以下文章