我有一个像
这样的集合{
"_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但我的匹配部分不起作用。任何人都可以指导我哪里出错了吗?
答案 0 :(得分:5)
您需要投影其他字段, $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
}
答案 1 :(得分:5)
这实际上是一个非常简单的查询,其中的技巧是使用“点符号”属性来测试数组。您真正需要的是数据索引为2
$exists
的文档,这意味着数组必须包含3
个元素或更多元素:
db.entity.find({ "SSCEXPEND.2": { "$exists": true } })
这是最快的方法,甚至可以使用索引。无需在聚合操作中进行计算。