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

すべてのキーを一覧表示せずに、サブフィールドをプロジェクションのトップレベルにプロモートします

    MongoDB 3.4では、$objectToArrayを使用できます および$arrayToObject $replaceRootを使用 これを変更するには:

    db.wish.aggregate([
      { "$replaceRoot": {
        "newRoot": {
          "$arrayToObject": {
            "$concatArrays": [
              [{ "k": "a", "v": "$a" }],
              { "$objectToArray": "$z" }
            ]
          }
        }
      }}
    ])
    

    または、"a"を指定しなくても、この長い呪文でさえ プロパティ:

    db.wish.aggregate([
      { "$replaceRoot": {
        "newRoot": {
          "$arrayToObject": {
            "$reduce": {
              "input": {
                "$filter": {
                  "input": { "$objectToArray": "$$ROOT" },
                  "as": "r",
                  "cond": { "$ne": [ "$$r.k", "_id" ] }
                }
              },
              "initialValue": [],
              "in": {
                "$concatArrays": [
                  "$$value",
                  { "$cond": {
                    "if": {  "$gt": [ "$$this.v", {} ] },
                    "then": { "$objectToArray": "$$this.v" },
                    "else": ["$$this"]
                  }}
                ]
              }  
            } 
          }
        }
      }}
    ])  
    

    どちらも生成します:

    { "a" : 1, "b" : 2, "c" : 3 }
    

    $concatArraysの面白い使い方 $mergeObjectsがあるため、将来のバージョンでは必要ありません。 それを少しきれいにする演算子。

    しかし、基本的には、クライアントコードで同じことを非常に簡単に行うことができます。たとえば、シェルのJavaScriptの場合:

    db.wish.find().map( doc => (
      Object.assign({ a: doc.a }, doc.z )
    ))
    

    または、"a"のないバージョン もう一度:

    db.wish.find().map( doc => 
      Object.keys(doc).filter(k => k !== '_id').map(k => 
       ( typeof(doc[k]) === "object" ) ? 
         Object.keys(doc[k]).map(i => ({ [i]: doc[k][i] }))
           .reduce((acc, curr) => Object.assign(acc,curr),{})
         : { [k]: doc[k] }
      ).reduce((acc,curr) => Object.assign(acc,curr),{})
    )
    

    同じ出力を生成します

    { "a" : 1, "b" : 2, "c" : 3 }
    



    1. マングースは、ベースが存在しない場合、配列に複数のオブジェクトを追加します

    2. 例外:BSONタイプEOOから日付に変換できません

    3. mongoDBで多くの日付を適切にインクリメントするにはどうすればよいですか?

    4. springboot2.0で@cacheableを使用するときにredisキャッシュごとに異なるttlを構成する方法