Menggunakan MongoDB 3.4.4 dan versi yang lebih baru:
db.coll.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
Pipa di atas akan menghasilkan keluaran akhir
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
Penjelasan
Pipeline dapat didekomposisi untuk menunjukkan hasil masing-masing operator.
$objectToArray
memungkinkan Anda untuk mengubah dokumen root dengan kunci dinamis (dilambangkan dengan variabel sistem $$ROOT
) ke dalam larik yang berisi elemen untuk setiap pasangan bidang/nilai dalam dokumen asli. Setiap elemen dalam larik kembali adalah dokumen yang berisi dua bidang k dan v.Menjalankan pipeline hanya dengan operator di $project
panggung
db.coll.aggregate([
{ "$project": {
"keys": { "$objectToArray": "$$ROOT" }
} }
])
hasil
{
"_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
operator bertindak sebagai mekanisme pemfilteran untuk larik yang dihasilkan oleh $objectToArray
operator, bekerja dengan memilih subset array untuk dikembalikan berdasarkan kondisi tertentu yang menjadi kueri Anda.
Pertimbangkan pipa berikut yang mengembalikan larik pasangan kunci/nilai yang cocok dengan kondisi { "samekeyA": "value1" }
db.coll.aggregate([
{ "$project": {
"keys": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
} }
])
yang menghasilkan
{
"_id" : 1,
"keys" : [
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
}
Ini akan mengubah array yang difilter di atas dari
[
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
ke dokumen asli dengan kunci dinamis
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
jadi jalankan pipeline
db.coll.aggregate([
{ "$project": {
"key": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
akan menghasilkan
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
Ini akan mempromosikan dokumen kunci dinamis yang difilter ke tingkat teratas dan menggantikan semua bidang lainnya. Operasi menggantikan semua bidang yang ada di dokumen input, termasuk _id
bidang.
Pada dasarnya ini mengubah dokumen di atas
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
ke hasil akhir yang diinginkan
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}