我在MongoDB中使用以下结构获得了大量文档:
{
"_id" : ObjectId("..."),
"plant" : "XY_4711",
"hour" : 1473321600,
"units" : [
{
"_id" : ObjectId("..."),
"unit_id" : 10951,
"values" : [
{
"quarter" : 1473321600,
"value" : 395,
},
{
"quarter" : 1473322500,
"value" : 402,
},
{
"quarter" : 1473323400,
"value" : 406,
},
{
"quarter" : 1473324300,
"value" : 410,
}
]
}
]
}
现在我需要查找quarter
介于某些给定时间戳之间的所有嵌入文档值(例如: {$ gte:1473324300,$ lte:1473328800} )。
我只获得了from / to的unit_id和季度时间戳来过滤文档。而且我只需要按季度分组和排序的季度和值。
我是MongoDB的新手并阅读了有关find()
和aggregate()
的内容。但我不知道该怎么做。 MongoDB 3.0安装在服务器上。
我只需拆开每个阵列,过滤掉我不需要的东西并将其重新组合在一起:
db.collection.aggregate([
{$match : {$and : [{"units.values.quarter" : {$gte : 1473324300}}, {"units.values.quarter" : {$lte : 1473328800 }}]}},
{$unwind: "$units"},
{$unwind: "$units.values"},
{$match : {$and : [{"units.values.quarter" : {$gte : 1473324300}}, {"units.values.quarter" : {$lte : 1473328800 }}]}},
{$project: {"units": {values: {quarter: 1, "value": 1}, unit_id: 1}}},
{$group: {"_id": "$units.unit_id", "quarter_values": {$push: "$units.values"}}} ,
{$sort: {"_id": 1}}
])
会给:
{
"_id" : 10951,
"quarter_values" : [
{
"quarter" : 1473324300,
"value" : 410
},
{
"quarter" : 1473325200,
"value" : 412
},
{
"quarter" : 1473326100,
"value" : 412
},
{
"quarter" : 1473327000,
"value" : 411
},
{
"quarter" : 1473327900,
"value" : 408
},
{
"quarter" : 1473328800,
"value" : 403
}
]
}
有关详细说明,请参阅:Return only matched sub-document elements within a nested array!
我想我将来必须切换到$ map或$ filter。感谢notionquest支持我的问题:)
答案 0 :(得分:2)
请参阅下面的示例查询。我没有完全满足你的分组要求。但是,使用此示例查询,您应该能够更改并获得所需的输出。
Image.prototype.contructor = function(arguments){ // Webworker implementation }
//or
Image.prototype.setSrc = function(arguments){ // Webworker implementation }
var image = new Image('somePath.jpg'); //or
image.setSrc('somePath.jpg');
示例输出: -
db.collection.aggregate([
{$unwind : {path : "$units"}},
{$match : {$and : [{"units.values.quarter" : {$gte : 1473324300}}, {"units.values.quarter" : {$lte : 1473328800 }}]}},
{$project : {"units" : {values : {quarter : 1, "value" : 1}, unit_id : 1}}},
{$group : { _id : "$units.unit_id", quarter_values : { $push :{ quarter : "$units.values.quarter", value : "$units.values.value"}}}},
{$sort : {_id : 1 }}
]);