Korzystanie z MongoDB 3.4.4 i nowszych wersji:
db.coll.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
Powyższy potok da ostateczny wynik
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
Wyjaśnienia
Potok można rozłożyć, aby pokazać wyniki poszczególnych operatorów.
$objectToArray
umożliwia przekształcenie dokumentu głównego za pomocą kluczy dynamicznych (oznaczonych zmienną systemową $$ROOT
) do tablicy zawierającej element dla każdej pary pole/wartość w oryginalnym dokumencie. Każdy element w tablicy return jest dokumentem zawierającym dwa pola k i v. Uruchamianie potoku tylko z operatorem w $project
scena
db.coll.aggregate([
{ "$project": {
"keys": { "$objectToArray": "$$ROOT" }
} }
])
plony
{
"_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 działa jako mechanizm filtrujący dla tablicy tworzonej przez $objectToArray
operator, działa poprzez wybranie podzbioru tablicy do zwrócenia na podstawie określonego warunku, który staje się zapytaniem.
Rozważmy następujący potok, który zwraca tablicę pary klucz/wartość, która pasuje do warunku { "samekeyA": "value1" }
db.coll.aggregate([
{ "$project": {
"keys": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
} }
])
co daje
{
"_id" : 1,
"keys" : [
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
}
Spowoduje to przekształcenie filtrowanej tablicy powyżej z
[
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
do oryginalnego dokumentu za pomocą klawisza dynamicznego
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
więc uruchamianie potoku
db.coll.aggregate([
{ "$project": {
"key": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
wyprodukuje
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
Spowoduje to awans przefiltrowanego dokumentu z kluczem dynamicznym na najwyższy poziom i zastąpienie wszystkich innych pól. Operacja zastępuje wszystkie istniejące pola w dokumencie wejściowym, w tym _id
pole.
Zasadniczo przekształca to powyższy dokument
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
do pożądanego wyjścia końcowego
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}