MongoDB 3.4.4 en nieuwere versies gebruiken:
db.coll.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
De bovenstaande pijplijn zal de uiteindelijke output opleveren
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
Uitleg
De pijplijn kan worden ontleed om de resultaten van elke individuele operator weer te geven.
$objectToArray
stelt u in staat om het hoofddocument te transformeren met dynamische sleutels (aangegeven door de systeemvariabele $$ROOT
) in een array die een element bevat voor elk veld/waarde-paar in het originele document. Elk element in de return-array is een document dat twee velden k en v bevat. De pijplijn uitvoeren met alleen de operator in een $project
podium
db.coll.aggregate([
{ "$project": {
"keys": { "$objectToArray": "$$ROOT" }
} }
])
opbrengsten
{
"_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"
}
}
]
}
De $filter
operator fungeert als een filtermechanisme voor de array die wordt geproduceerd door de $objectToArray
operator, werkt door een subset van de array te selecteren die moet worden geretourneerd op basis van de opgegeven voorwaarde die uw query wordt.
Overweeg de volgende pijplijn die een array retourneert van het sleutel/waarde-paar dat overeenkomt met de voorwaarde { "samekeyA": "value1" }
db.coll.aggregate([
{ "$project": {
"keys": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
} }
])
wat oplevert
{
"_id" : 1,
"keys" : [
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
}
Dit zal de gefilterde array hierboven transformeren van
[
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
naar het originele document met de dynamische sleutel
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
dus de pijplijn runnen
db.coll.aggregate([
{ "$project": {
"key": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
zal produceren
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
Hierdoor wordt het gefilterde dynamische sleuteldocument naar het hoogste niveau gepromoveerd en worden alle andere velden vervangen. De bewerking vervangt alle bestaande velden in het invoerdocument, inclusief de _id
veld.
In wezen transformeert dit het bovenstaande document
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
naar de gewenste einduitvoer
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}