1

给定以下文档结构:

{
  _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 方面相当陌生,所以我不确定我应该关注什么方向。这是一个新的数据模型,所以如果有关于修改文档模型的建议,我也愿意倾听。

4

2 回答 2

2

如果这些值只是按时顺序推送到数组中(如您的数据所示),您可以使用:db.coll.find({}, {"properties.values" : {$slice : -1}})

它不保证最新。它将返回数组中的最后一项。由于您的 values 数组是按 created 隐式排序的,因此这将起作用。

由于聚合框架不允许您展开嵌套数组,如果不是这种情况(值不是由创建的推送),我认为您将不得不使用 map reduce。

于 2013-08-09T21:47:56.540 回答
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
}

您可能需要对结果进行一些转换,但这不是问题,对吧?

于 2013-08-09T23:03:49.827 回答