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 とマップ/リデュース全般を扱うのにかなり慣れていないので、どの方向を見ればよいかわかりません。これは新しいデータ モデルであるため、ドキュメント モデルの変更に関する提案があれば、喜んで耳を傾けます。

4

2 に答える 2

2

(データが示唆するように)値がタイムリーな順序で配列にプッシュされるだけの場合は、次を使用できます。db.coll.find({}, {"properties.values" : {$slice : -1}})

最新を保証するものではありません。配列の最後の項目を返します。values 配列は作成されたものによって暗黙的にソートされるため、これは機能します。

集約フレームワークではネストされた配列を巻き戻すことができないため、そうでない場合 (作成によって値がプッシュされていない場合) は、map reduce を使用する必要があると思います。

于 2013-08-09T21:47:56.540 に答える
2

集約パイプラインでは$first、 and$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 に答える