1

Nodejs、mongoose、および MongoDB を使用してマップ削減操作を機能させようとしています。私はかなりフラットなスキーマ構造を持っており、「名前付き」オブジェクトごとに値/日付のペアのリストを取得したいと考えています。map reduce 関数には明らかに何か問題がありますが、それを修正して目的のフォーマットを取得する方法がわかりません。

MongoDB ドキュメント スキーマは次のとおりです。

{ "name" : "object1", "value" : "123", "date" : "2013-01-02 01:00:00" }
{ "name" : "object1", "value" : "456", "date" : "2013-01-02 02:00:00" }
{ "name" : "object2", "value" : "123", "date" : "2013-01-02 02:00:00" }

Mongoose スキーマで使用している map reduce 関数は次のとおりです。

var o = {};
o.map = function () { 
  emit(
    { 'name': this.name },
    {'data': [ { 'value': this.value, 'date': this.date} ] }
  )
}

o.reduce = function (k, vals) { 
  var reduced = {'data': []};
  for (var i in vals) {
    reduced.data.push(vals[i]);
  }
  return reduced;
}

this.mapReduce(o, function(err, model) {
  if(err) console.log(err);
  model.find().exec(cb);
});

私が見たいのは、次の行に沿ったJSONです

[
  {
    "name": "object1",
    "data": [
      {
        "value": "123",
        "date": "2013-01-02T01:00:00.123456"
      },
      {
        "value": "456",
        "date": "2013-01-02T02:00:00.123456"
      },
    ]
  },
  {
    "name": "object2",
    "data": [
      {
        "value": "123",
        "date": "2013-04-22T13:10:03.893018"
      },
      ...
    ]
  },
  ...

しかし、私はこのネストされた混乱を得るのです! 誰かが私が見逃したものを教えてくれますか!!

[
  {
    "_id": {
      "name": "object1"
    },
    "value": {
      "data": [
        {
          "data": [
            {
              "data": [
                {
                  "data": [
                    {
                      "value": "123",
                      "date": "2013-01-02T02:00:00.123456"
                    }
                  ]
                },
                {
                  "data": [
                    {
                      "value": "465",
                      "date": "2013-01-02T01:00:00.123456"
                    }
                  ]
                },
                ... etc
4

1 に答える 1

0

そのようなことを試してください:(テストされていませんが、アイデアはここにあると思います:))

var o = {};
o.map = function () { 
  emit(this.name, { 'value': this.value, 'date': this.date} )
}

o.reduce = function (k, vals) { 
  var reduced = {name: k, data : []};
  for (var i in vals) {
    reduced.data.push(vals[i]);
  }
  return reduced;

  // or just return vals? it's already the array you want.
}
于 2013-04-22T21:17:47.197 に答える