这是我在集合中的数据:
{ "installation" : 200278 ,
"date" : [
{ "date" : "2014-12-28" ,
"values" : [
{ "time" : "2014-12-28 00:15:26" , "value" : 26},
{ "time" : "2014-12-28 00:30:26" , "value" : 15} ,
{ "time" : "2014-12-28 00:45:26" , "value" : 7} ,
{ "time" : "2014-12-28 01:00:26" , "value" : 32}
]
},
{ "date" : "2014-12-29" ,
"values" : [
{ "time" : "2014-12-29 00:15:26" , "value" : 26},
{ "time" : "2014-12-29 00:30:26" , "value" : 15} ,
{ "time" : "2014-12-29 00:45:26" , "value" : 7} ,
{ "time" : "2014-12-29 01:00:26" , "value" : 32}
]
}
]
},
{ "installation" : 200312
...
我试着查询一下:
db.measure.find({"installation" : 200278 , "date.date" : "2014-12-28"},
{"date.date" : 1 , "_id" : 0})
.sort({"date.date" : 1})
首先,我不明白为什么" date.date"不只是返回元素" 2014-12-28"。 另外,也许我的排序错了,但无论我在1号上的标志是否仍然返回相同的顺序。
结果:
{ "date" : [ { "date" : "2014-12-28" }, { "date" : "2014-12-29" } ] }
澄清
我希望我的查询返回的只是元素:
{" date" :" 2014-12-28" }
排序问题是我对Mongo api进行黑客攻击的延伸。并且想知道这个查询是如何工作的。
答案 0 :(得分:2)
您需要汇总结果。
执行与sort()
链接的find()
时,排序适用于由find()
查询过滤的根文档,而不适用于数组子文档。
为了对数组元素进行排序,您需要使用聚合管道,如下所示:
db.measure.aggregate([
{$match:{"installation" : 200278,"date.date" : "2014-12-28"}},
{$unwind:"$date"},
{$sort:{"date.date":-1}},
{$group:{"_id":"$id","installation":{$first:"$installation"},"date":{$push:"$date"}}},
{$project:{"_id" : 0,"installation":1,"date.date":1}}
])
首先,我不明白为什么" date.date"不仅会使用" 2014-12-28"。
返回元素
要仅获取与查询匹配的第一个数组元素,您需要使用$(位置运算符)。
db.measure.find({"installation" : 200278 ,
"date.date" : "2014-12-28"},
{"date.$" : 1,"_id":0})
如果您希望date
数组始终按date
排序,则可以确保在对数组进行更新时,使用$each
和{{1}更新运营商。
$sort
因此,查找查询将始终返回每个安装的已排序日期文档数组。
答案 1 :(得分:0)
在我们自己的@BatScream
的帮助下,为完整性提供美化解决方案db.measure.aggregate([ {$match:{ "installation" : 200278}},
{$unwind:"$date"},
{$match:{"date.date":"2014-12-28"}},
{$project:{"_id" : 0,"date.date":1, "date.values":1}}
])
结果:
{ date" : { "date" : "2014-12-28", "values" : [
{ "time" : "2014-12-28 00:15:26", "value" : 26 },
{ "time" : "2014-12-28 00:30:26", "value" : 15 },
{ "time" : "2014-12-28 00:45:26", "value" : 7 },
{ "time" : "2014-12-28 01:00:26", "value" : 32 }
]
} }