Používání MongoDB 3.4.4 a novějších verzí:
db.coll.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
Výše uvedené potrubí poskytne konečný výstup
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
Vysvětlení
Potrubí lze rozložit a zobrazit výsledky každého jednotlivého operátora.
$objectToArray
umožňuje transformovat kořenový dokument pomocí dynamických klíčů (označených systémovou proměnnou $$ROOT
) do pole, které obsahuje prvek pro každý pár pole/hodnota v původním dokumentu. Každý prvek v poli návratu je dokument, který obsahuje dvě pole k a v. Spuštění kanálu pouze s operátorem v $project
etapa
db.coll.aggregate([
{ "$project": {
"keys": { "$objectToArray": "$$ROOT" }
} }
])
výnosy
{
"_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
operátor funguje jako filtrovací mechanismus pro pole vytvořené $objectToArray
funguje tak, že vybere podmnožinu pole, která se má vrátit, na základě zadané podmínky, která se stane vaším dotazem.
Zvažte následující kanál, který vrací pole páru klíč/hodnota odpovídající podmínce { "samekeyA": "value1" }
db.coll.aggregate([
{ "$project": {
"keys": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
} }
])
který vynáší
{
"_id" : 1,
"keys" : [
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
}
Tím se transformuje filtrované pole výše z
[
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
do původního dokumentu pomocí dynamického klíče
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
tak běží potrubí
db.coll.aggregate([
{ "$project": {
"key": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
vyrobí
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
Tím povýšíte dokument filtrovaného dynamického klíče na nejvyšší úroveň a nahradíte všechna ostatní pole. Operace nahradí všechna existující pole ve vstupním dokumentu, včetně _id
pole.
V podstatě to transformuje výše uvedený dokument
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
na požadovaný konečný výstup
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}