Sử dụng MongoDB 3.4.4 và các phiên bản mới hơn:
db.coll.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
Đường ống trên sẽ mang lại đầu ra cuối cùng
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
Giải thích
Đường ống có thể được phân tách để hiển thị kết quả của từng người vận hành.
$objectToArray
cho phép bạn chuyển đổi tài liệu gốc bằng các khóa động (được biểu thị bằng biến hệ thống $$ROOT
) thành một mảng có chứa một phần tử cho mỗi cặp trường / giá trị trong tài liệu gốc. Mỗi phần tử trong mảng trả về là một tài liệu chứa hai trường k và v. Chạy đường ống chỉ với toán tử trong $project
sân khấu
db.coll.aggregate([
{ "$project": {
"keys": { "$objectToArray": "$$ROOT" }
} }
])
lợi tức
{
"_id" : 1,
"keys" : [
{
"k" : "_id",
"v" : 1
},
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
},
{
"k" : "key2",
"v" : {
"samekeyA" : "value3",
"samekeyB" : "value4"
}
},
{
"k" : "key3",
"v" : {
"samekeyA" : "value5",
"samekeyB" : "value6"
}
}
]
}
$filter
toán tử hoạt động như một cơ chế lọc cho mảng được tạo bởi $objectToArray
, hoạt động bằng cách chọn một tập hợp con của mảng để trả về dựa trên điều kiện được chỉ định xuất hiện trong truy vấn của bạn.
Hãy xem xét đường dẫn sau đây trả về một mảng của cặp khóa / giá trị phù hợp với điều kiện { "samekeyA": "value1" }
db.coll.aggregate([
{ "$project": {
"keys": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
} }
])
cái nào mang lại
{
"_id" : 1,
"keys" : [
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
}
Điều này sẽ biến đổi mảng đã lọc ở trên từ
[
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
vào tài liệu gốc bằng khóa động
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
vì vậy chạy đường ống
db.coll.aggregate([
{ "$project": {
"key": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
sẽ sản xuất
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
Điều này sẽ thúc đẩy tài liệu khóa động đã lọc lên cấp cao nhất và thay thế tất cả các trường khác. Thao tác này sẽ thay thế tất cả các trường hiện có trong tài liệu đầu vào, bao gồm cả _id
đồng ruộng.
Về cơ bản, điều này biến đổi tài liệu trên
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
đến đầu ra cuối cùng mong muốn
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}