我有这个聚合查询,这需要很长时间才能得到结果,因为$ unwind参数我只需要聚合框架。具体来说,我必须查询数组中的内容。如何将此聚合查询重写为查找查询,您认为使用find会更好吗?
db.cms.aggregate([{"$unwind":"$values"},
{"$match": {"values.timestamp":{"$exists":1}}},
{"$match": {"values.sensor":"V1"}},
{"$match": {"values.timestamp":{"$gte":"2018-02-07 14:00:16.163","$lte":"2018-02-07 14:00:16.163"}}}] )
集合中的文档看起来像这样
_id" : ObjectId("5a8ac17569191602538b65d2"),
"values" : [
{
"sensor" : "B",
"unit" : "mm/s2",
"timestamp": "2018-02-07 14:00:16.163"
},
{
"sensor" : "Bp",
"unit" : "mm/s2",
"timestamp": "2018-02-07 14:00:16.163"
},
{
"sensor" : "Bt",
"unit" : "mm/s2",
"timestamp": "2018-02-07 14:00:16.163"
},
{
"sensor" : "V1",
"timestamp" : "2018-02-07 14:00:16.163",
"unit" : "V"
}]}
答案 0 :(得分:1)
如果只需要过滤掉,只需使用$filter
运算符:
db.cms.aggregate([
{
$project: {
values : {
$filter: {
input: "$values",
as: "value",
cond: {
$and: [
{ $ifNull: [ "$$value.type", false ] },
{ $eq: [ "$$value.sensor", "V1" ] },
{ $eq: [ "$$value.timestamp", "2018-02-07 14:00:16.163" ] },
]
}
}
}
}
}
])
顺便说一下,聚合cond
运算符的$filter
字段需要一个解析为布尔值的表达式。我们不能用
$exists
或任何查询运算符,其聚合等效项是$ifNull
运算符。