我有一个问题:
db.events.aggregate(
{ $match: { "camera._id": "1NJE48", "start_timestamp": { $lte: 1407803834.07 } } },
{ $sort: { "start_timestamp": -1 } },
{ $limit: 2 },
{ $project: { "_id": 0, "snapshots": 1 } }
)
它返回如下数据:
/* 0 */
{
"result" : [
{
"snapshots" : {
"1401330834010" : {
"uploaded_timestamp" : 1401330895,
"filename_timestamp" : 1401330834.01,
"timestamp" : 1401330834.01
},
"1401330835010" : {
"uploaded_timestamp" : 1401330896,
"filename_timestamp" : 1401330835.01,
"timestamp" : 1401330835.01
},
"1401330837010" : {
"uploaded_timestamp" : 1401330899,
"filename_timestamp" : 1401330837.01,
"timestamp" : 1401330837.01
}
}
},
{
"snapshots" : {
"1401319837010" : {
"uploaded_timestamp" : 1401319848,
"filename_timestamp" : 1401319837.01,
"timestamp" : 1401319837.01
},
"1401319838010" : {
"uploaded_timestamp" : 1401319849,
"filename_timestamp" : 1401319838.01,
"timestamp" : 1401319838.01
},
"1401319839010" : {
"uploaded_timestamp" : 1401319850,
"filename_timestamp" : 1401319839.01,
"timestamp" : 1401319839.01
}
}
}
],
"ok" : 1
}
我想要一系列快照:
/* 0 */
{
"result" : [
{
"uploaded_timestamp" : 1401330895,
"filename_timestamp" : 1401330834.01,
"timestamp" : 1401330834.01
},
{
"uploaded_timestamp" : 1401330896,
"filename_timestamp" : 1401330835.01,
"timestamp" : 1401330835.01
},
{
"uploaded_timestamp" : 1401330899,
"filename_timestamp" : 1401330837.01,
"timestamp" : 1401330837.01
},
{
"uploaded_timestamp" : 1401319848,
"filename_timestamp" : 1401319837.01,
"timestamp" : 1401319837.01
},
{
"uploaded_timestamp" : 1401319849,
"filename_timestamp" : 1401319838.01,
"timestamp" : 1401319838.01
},
{
"uploaded_timestamp" : 1401319850,
"filename_timestamp" : 1401319839.01,
"timestamp" : 1401319839.01
}
],
"ok" : 1
}
即。没有关键名称。当关键名称像这里一样独特时,我很难理解如何处理聚合框架。
答案 0 :(得分:0)
问题是你知道密钥名称的唯一方法是查看文档本身。一般而言,MongoDB不能很好地处理这种情况。您应该知道自己文档的结构,即知道密钥是什么以及它们的类型应该是什么。
我不知道你的用例,也没有样本文档所以我无法评估你的数据模型,但是按键值作为值通常是一个坏主意,因为你会遇到一系列限制不要说文档上的键应该是先验的。考虑使用数组而不是嵌入对象来创建快照,或者使用像
这样的键值对模式数组{
...
"result" : [
{
"snapshots" : [
{
"key" : "1401330834010",
"value" : {
"uploaded_timestamp" : 1401330895,
"filename_timestamp" : 1401330834.01,
"timestamp" : 1401330834.01
},
}
]
},
...
}
如果您提供示例文档以及有关您要完成的内容的一些详细信息,我们很乐意提供更完整的建议。
答案 1 :(得分:0)
想出了一个停止间隙解决方案。我们将在一个事件的数组中存储一组快照键。它本质上充当索引。然后我们可以执行2个查询 - 一个用于获取密钥,一个用于过滤,另一个用于正确获取我们需要的单个快照。
它不漂亮,也不向后兼容,但它有望加快速度。