MongoDB聚合-忽略密钥名称

MongoDB聚合-忽略密钥名称,mongodb,mongodb-query,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

我有一个问题:

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
}

即没有关键名称。我很难理解当关键字名称像这里一样是唯一的时如何处理聚合框架。

问题是,知道关键字名称的唯一方法是查看文档本身。一般来说,MongoDB不能很好地处理这种情况。您需要了解自己文档的结构,即了解密钥是什么以及它们的类型

我不知道您的用例,也没有示例文档,因此我无法评估您的数据模型,但将键作为值通常是一个坏主意,因为当您不能说文档上的键应该是什么时,您将遇到许多限制。考虑使用数组来代替快照的嵌入对象,或者使用类似于

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

如果您提供一份示例文档和一些关于您试图实现的目标的详细信息,我很乐意提供更完整的建议。

想出了一个权宜之计。我们将在一个事件的数组中存储一个快照键数组。它本质上起着索引的作用。然后,我们可以执行两个查询—一个用于获取密钥并进行筛选,另一个用于正确获取所需的单个快照


它既不美观,也不向后兼容,但有望加快速度。

您必须使用一些JavaScript解析上传的时间戳、文件名时间戳、时间戳字段。我不认为聚合管道可以处理这样的唯一ObjectID…谢谢。更改模式是一项较大的任务,但我们已将其添加到列表中。