鉴于以下文件结构:
{
_id: "abc123",
name: "Some name",
properties: [
{
definition: "temp",
values: [
{
created: 1376061128,
value: 82
},
{
created: 1376062368,
value: 85
},
{
created: 1376062627,
value: 88
}
]
},
{
definition: "alert",
values: [
{
created: 1376061128,
value: 0
},
{
created: 1376062368,
value: 1
},
{
created: 1376062627,
value: 0
}
]
}
]
}
我希望能够返回仅包含"最新"的文档。 (基于创建的)每个属性的值,如:
{
_id: "abc123",
name: "Some name",
properties: [
{
definition: "temp",
values: [
created: 1376062627,
value: 88
]
},
{
definition: "alert",
values: [
created: 1376062627,
value: 0
]
}
]
}
我在处理MongoDB和map / reduce方面相当新,所以我不确定我应该看哪个方向。这是一个新的数据模型,因此如果有关于文档模型修改的建议,我也愿意倾听。
答案 0 :(得分:2)
如果值只是按时按顺序推送到数组(如数据所示),您可以使用:db.coll.find({}, {"properties.values" : {$slice : -1}})
它不保证最新。它将返回数组中的最后一项。由于您的values数组是按创建方式隐式排序的,因此可以使用。
由于聚合框架不允许您展开嵌套数组,如果不是这种情况(值没有被创建推送),您将不得不使用map reduce。
答案 1 :(得分:2)
在汇总管道中,您可以使用$first
和$last
运算符,这对您的情况很有帮助。我花了一段时间为此构建一个聚合管道,它可能不是最佳的,但它正在工作:
db.test.aggregate([
{$unwind : "$properties"},
{$unwind : "$properties.values"},
{$sort : {
"_id" : 1,
"name" : 1,
"properties.definition" : 1,
"properties.values.created" : 1
}},
{$group : {
"_id" : {
"_id" : "$_id",
"name" : "$name",
"definition" : "$properties.definition"
},
"created" : {$last : "$properties.values.created"},
"value" : {$last : "$properties.values.value"}
}}
])
结果是:
{
"result" : [
{
"_id" : {
"_id" : "abc123",
"name" : "Some name",
"definition" : "temp"
},
"created" : 1376062627,
"value" : 88
},
{
"_id" : {
"_id" : "abc123",
"name" : "Some name",
"definition" : "alert"
},
"created" : 1376062627,
"value" : 0
}
],
"ok" : 1
}
您可能需要对结果进行一点转换,但it is not a problem,对吗?