MongoDB聚合 - 忽略键名

时间:2014-08-12 02:37:15

标签: mongodb mongodb-query

我有一个问题:

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
}

即。没有关键名称。当关键名称像这里一样独特时,我很难理解如何处理聚合框架。

2 个答案:

答案 0 :(得分:0)

问题是你知道密钥名称的唯一方法是查看文档本身。一般而言,MongoDB不能很好地处理这种情况。您应该知道自己文档的结构,即知道密钥是什么以及它们的类型应该是什么。

我不知道你的用例,也没有样本文档所以我无法评估你的数据模型,但是按键值作为值通常是一个坏主意,因为你会遇到一系列限制不要说文档上的键应该是先验的。考虑使用数组而不是嵌入对象来创建快照,或者使用像

这样的键值对模式数组
{
    ...
    "result" : [ 
    {
        "snapshots" : [
            { 
                "key" : "1401330834010", 
                "value" : {
                    "uploaded_timestamp" : 1401330895,
                    "filename_timestamp" : 1401330834.01,
                    "timestamp" : 1401330834.01
                },
            }
        ]
    },
    ...
}

如果您提供示例文档以及有关您要完成的内容的一些详细信息,我们很乐意提供更完整的建议。

答案 1 :(得分:0)

想出了一个停止间隙解决方案。我们将在一个事件的数组中存储一组快照键。它本质上充当索引。然后我们可以执行2个查询 - 一个用于获取密钥,一个用于过滤,另一个用于正确获取我们需要的单个快照。

它不漂亮,也不向后兼容,但它有望加快速度。