Trong bản phát hành Modern MongoDB, cách hiệu quả nhất là chỉ cần ghi chú mảng bằng cách sử dụng các thuộc tính tài liệu hiện có. Ký hiệu trực tiếp của mảng đã được giới thiệu trong MongoDB 3.2:
db.collection.aggregate([
{ "$project": {
"lat": 1,
"long": 1,
"geometry": {
"type": { "$literal": "Point" },
"coordinates": [ "$lat", "$long" ]
}
}},
{ "$out": "newcollection" }
])
Hoặc thậm chí sử dụng $ addFields
chỉ cần "nối" thuộc tính mới vào tài liệu:
db.collection.aggregate([
{ "$addFields": {
"geometry": {
"type": { "$literal": "Point" },
"coordinates": [ "$lat", "$long" ]
}
}},
{ "$out": "newcollection" }
])
Nếu bạn đang sử dụng MongoDB 2.6 trở lên, bạn có thể thực hiện việc này với khung tổng hợp và tránh kết quả lặp lại trong chương trình khách hàng của bạn để tạo một tập hợp mới.
Tính năng chính ở đây giúp bạn là $ ra
toán tử để gửi đầu ra đến một tập hợp mới. Nhưng cũng phải khéo léo một chút để tạo ra mảng mà bạn cần.
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" }
])
Vì vậy, điều này sử dụng $ đen
toán tử để chỉ định một mảng mới ở đầu đường dẫn. Toán tử này sẽ đưa nội dung vào thuộc tính tài liệu chính xác nó được cung cấp như thế nào. Vì vậy, không cho phép thay thế biến, do đó "theo nghĩa đen".
Để tạo mảng "coordintes", chúng ta chỉ cần giải phóng mảng đầu tiên đó về cơ bản tạo ra hai trong số mọi tài liệu có giá trị khác nhau trong "type". Sau đó, điều này được sử dụng trong $ group
chuyển sang giai đoạn có điều kiện $ push
giá trị "$ lat" hoặc "$ long" trên mảng đó.
Cuối cùng sử dụng $ project
một lần nữa để hoàn thiện cấu trúc tài liệu và sau đó $ out
gửi tất cả đầu ra vào bộ sưu tập mới.
Lưu ý rằng điều này chỉ có ý nghĩa nếu ý định của bạn là tạo một bộ sưu tập mới và tránh gửi lưu lượng truy cập "qua dây". Điều này không thể được sử dụng hoàn toàn trong khuôn khổ tổng hợp để định hình lại tài liệu của bạn với mục đích sau đó thực hiện truy vấn "không gian địa lý" trong cùng một đường dẫn tổng hợp như các truy vấn "không gian địa lý" sẽ chỉ hoạt động khi thực sự được lập chỉ mục trên một tập hợp .
Vì vậy, điều này có thể giúp bạn tạo một tập hợp mới như bạn muốn, nhưng ít nhất nó cũng đóng vai trò là ví dụ (hoặc thực tế là hai ví dụ) về cách tạo một mảng từ các giá trị khác nhau với khung tổng hợp.