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

集約フレームワークを使用して新しい配列フィールドを作成する方法

    最新のMongoDBリリースでは、最も効率的な方法は、既存のドキュメントプロパティを使用して配列を単純に表記することです。配列の直接表記はMongoDB3.2で導入されました:

    db.collection.aggregate([
      { "$project": {
        "lat": 1,
        "long": 1,
        "geometry": {
          "type": { "$literal": "Point" },
          "coordinates": [ "$lat", "$long" ]
        }
      }},
      { "$out": "newcollection" }
    ])
    

    または、 $ addFieldsを使用することもできます 新しいプロパティをドキュメントに単に「追加」するには:

    db.collection.aggregate([
      { "$addFields": {
        "geometry": {
          "type": { "$literal": "Point" },
          "coordinates": [ "$lat", "$long" ]
        }
      }},
      { "$out": "newcollection" }
    ])
    

    MongoDB 2.6以降を使用している場合は、集約フレームワークを使用してこれを実行し、新しいコレクションを作成するためにクライアントプログラムで結果がループしないようにすることができます。

    ここで役立つ主な機能は、 $アウト 出力を新しいコレクションに送信するための演算子。ただし、必要なアレイを作成するために少し賢いことも必要です。

    db.collection.aggregate([
        { "$project": {
            "lat": 1,
            "long": 1,
            "type": { "$literal": ["lat","long"] }
        }},
        { "$unwind": "$type" },
        { "$group": {
            "_id": "$_id",
            "lat": { "$first": "$lat" },
            "long": { "$first": "$long" },
            "coordinates": {
                "$push": {
                    "$cond": [
                        { "$eq": [ "$type", "lat" ] },
                        "$lat",
                        "$long"
                    ]
                }
            }
        }},
        { "$project": {
            "lat": 1,
            "long": 1,
            "geometry": { 
                "type": { "$literal": "Point" },
                "coordinates": "$coordinates"
            }
        }},
        { "$out": "newcollection" }
    ])
    

    したがって、これは $literal パイプラインの先頭で新しい配列を指定するための演算子。この演算子は、コンテンツをドキュメントプロパティに正確に配置します それがどのように供給されるか。したがって、変数の置換は許可されないため、「リテラル」になります。

    「coordintes」配列を作成するには、最初の配列をアンワインドするだけです。これにより、「type」の値が異なるすべてのドキュメントが2つ作成されます。これは、 $group 条件付きで $ pushへのステージ その配列の「$lat」または「$long」のいずれかの値。

    最後に、 $ projectを使用します もう一度ドキュメント構造を完成させてから、 $ out すべての出力を新しいコレクションに送信します。

    これは、新しいコレクションを作成し、「ネットワーク経由」でトラフィックを送信しないようにする場合にのみ意味があることに注意してください。これは、集約フレームワーク内で純粋に使用して、「地理空間」クエリがコレクションで実際にインデックス付けされた場合にのみ機能するのと同じ集約パイプラインで「地理空間」クエリを実行することを目的としてドキュメントを再形成することはできませんでした。 。

    したがって、これは必要に応じて新しいコレクションを作成するのに役立つ場合がありますが、少なくとも、集計フレームワークを使用してさまざまな値から配列を作成する方法の例(または実際には2つの例)として機能します。



    1. mongoimportを使用してjsonファイルをインポートする方法

    2. mongo PHPアプリエラー:致命的なエラー:キャッチされない例外'MongoException'とメッセージ''。 'キーでは許可されていません

    3. Debian9へのRedisのインストール

    4. redis:毎日カウンターをリセット