запрос mongodb у детей не известен - PullRequest
0 голосов
/ 27 августа 2018

Я работаю над mongodb. Я хотел бы иметь возможность искать в дочерних узлах, пропустив один уровень.

Давайте представим следующий документ:

{
    "node1": {
        "node2": {
            "node3": "test"
        },
        "node2a": {
            "node3": "testa"
        },
        "node2b": {
            "node3": "test"
        },
        "node2c": {
            "node3": "test"
        },
        "node2d": {
            "node3": "testa"
        }
    }
}

Если я хочу получить этот документ, я могу сделать:

{ "node1.node2a.node3" : "testa" }

Проблема в том, что мне придется искать во множестве документов, которые имеют разные значения "node2", поскольку они генерируются случайным образом. Однако узел 1 и узел 3 известны.

Теперь я хотел бы знать, можно ли это сделать:

{ "node1.WHATEVER.node3" : "testa" }

Это возможно?

Заранее спасибо

1 Ответ

0 голосов
/ 27 августа 2018

Этого можно добиться, используя агрегат: этап агрегации addFields с оператором $ objectToArray , затем сопоставьте и удалите добавленное поле.

db['01'].aggregate(
    [
        {
            $addFields: {
              "newNode1":{$objectToArray:"$node1"}
            }
        },
        {
            $match: {
            "newNode1.v.node3":"testa"
            }
        },
        {
            $project: {
                newNode1:0
            }
        },
    ]
);

Это предоставит все документы, которые содержат "testa" в качестве значения node3.

$ addFields с $ objectToArray приведет к следующей структуре, затем $ match и удалит созданное поле с $ project.

{ 
    "_id" : ObjectId("5b840cdf0b354c1b829a19fc"), 
    "node1" : {
        "node2" : {
            "node3" : "test"
        }, 
        "node2a" : {
            "node3" : "testa"
        }, 
        "node2b" : {
            "node3" : "test"
        }, 
        "node2c" : {
            "node3" : "test"
        }, 
        "node2d" : {
            "node3" : "testa"
        }
    }, 
    "newNode1" : [
        {
            "k" : "node2", 
            "v" : {
                "node3" : "test"
            }
        }, 
        {
            "k" : "node2a", 
            "v" : {
                "node3" : "testa"
            }
        }, 
        {
            "k" : "node2b", 
            "v" : {
                "node3" : "test"
            }
        }, 
        {
            "k" : "node2c", 
            "v" : {
                "node3" : "test"
            }
        }, 
        {
            "k" : "node2d", 
            "v" : {
                "node3" : "testa"
            }
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...