sql >> データベース >  >> NoSQL >> MongoDB

Mongodbの集約パイプラインを使用してコレクションを再フォーマットします

    metadata内の要素の位置 フィールドと埋め込まれたドキュメントのキーがわかっているので、集計を使用できます。

    db.foo.aggregate([
      {
        $project : {
          data : {
            "Language" : {
              $arrayElemAt : ["$metadata", 0]
            },
            "City" : {
              $arrayElemAt : ["$metadata", 1]
            },
            "Gender" : {
              $arrayElemAt : ["$metadata", 2]
            }
          }
        }
      },
      {
        $project : {
          metadata : {
            Language : "$data.Language.value",
            City : "$data.City.value",
            Gender : "$data.Gender.value"
          }
        }
      }
    ])
    

    結果:

    { "_id" : "213412323234", "metadata" : { "Language" : "EN", "City" : "New York", "Gender" : "Male" } }
    

    上記の2つの前提条件のいずれかが不明な場合は、 mapReduce

    db.foo.mapReduce(function () {
      var key = this._id;
      var metadata = this.metadata;
      var valueEmit = {};
      for (var i = 0; i < metadata.length; i++) {
        valueEmit[metadata[i].id] = metadata[i].value;
      }
      emit(key, valueEmit)
    },
    function(key, values) {
      // do nothing as it won't be called 
      // for if value is only one 
      // for a key
    },
    {
      out : {replace : "foobar"}
    })
    

    結果:

    > db.foobar.find()
    { "_id" : "213412323234", "value" : { "Language" : "EN", "City" : "New York", "Gender" : "Male" } }
    

    キーがvalueに変更されていることに注意してください メタデータの代わりに。これは、$projectを使用して簡単に修正できます。 aggregationfoobarで コレクション。



    1. mongodbを使用してphpでレコードを更新および挿入する方法

    2. MongoDBデータベースプロファイラーの概要

    3. Puppetを使用したMongoDBのデプロイとメンテナンスのガイド:パート1

    4. MongoDBjava.lang.ClassCastExceptionを使用したEclipselink