Brug af MongoDB 3.4.4 og nyere versioner:
db.coll.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
Ovenstående pipeline vil give det endelige output
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
Forklaringer
Rørledningen kan dekomponeres for at vise hver enkelt operatørs resultater.
$objectToArray
giver dig mulighed for at transformere roddokumentet med dynamiske nøgler (angivet med systemvariablen $$ROOT
) i et array, der indeholder et element for hvert felt/værdipar i det originale dokument. Hvert element i returarrayet er et dokument, der indeholder to felter k og v. Kører pipelinen med kun operatøren i en $project
scenen
db.coll.aggregate([
{ "$project": {
"keys": { "$objectToArray": "$$ROOT" }
} }
])
udbytte
{
"_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
operatøren fungerer som en filtreringsmekanisme for arrayet produceret af $objectToArray
operator, fungerer ved at vælge en delmængde af arrayet, der skal returneres baseret på den angivne betingelse, som bliver din forespørgsel.
Overvej følgende pipeline, som returnerer en matrix af nøgle/værdi-parret, der matcher betingelsen { "samekeyA": "value1" }
db.coll.aggregate([
{ "$project": {
"keys": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
} }
])
hvilket giver
{
"_id" : 1,
"keys" : [
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
}
Dette vil transformere det filtrerede array ovenfor fra
[
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
til det originale dokument med den dynamiske nøgle
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
så kører pipelinen
db.coll.aggregate([
{ "$project": {
"key": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
vil producere
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
Dette vil fremme det filtrerede dynamiske nøgledokument til det øverste niveau og erstatter alle andre felter. Handlingen erstatter alle eksisterende felter i inputdokumentet, inklusive _id
Mark.
Dette transformerer i det væsentlige ovenstående dokument
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
til det ønskede endelige output
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}