最新の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つの例)として機能します。