Как найти подполе в Монго, не зная родительского поля? - PullRequest
1 голос
/ 31 октября 2019

Учитывая следующую коллекцию:

db.test.insertMany([
    {"_id": 1, "Jimmy": {"Loved by mom": true}},
    {"_id": 2, "Andrew": {"Loved by mom": false}},
    {"_id": 3, "Nicholas": {"Loved by mom": true}}",
    {"_id": 4, "Sarah": {"Loved by dad": true}}
]);

Есть ли способ поиска всех документов, имеющих подполе "Loved by mom", не зная, как называется родительское поле? Чтобы (надеюсь) упростить эту задачу, нужное подполе всегда находится на глубине 1.

Ответы [ 3 ]

1 голос
/ 31 октября 2019

Есть ли способ поиска всех документов, имеющих подполе «Любимые мамой», не зная, как называется родительское поле?

Этот запрос агрегации может сделать это:

var loved_by_mom = "Loved by mom";

db.loved.aggregate( [
        { $addFields: { fieldNameValues: { $objectToArray: "$$ROOT" } } },
        { $unwind: "$fieldNameValues" },
        { $addFields: { fldType: { $type: "$fieldNameValues.v" } } },
        { $match: { fldType: "object" } },
        { $addFields: { objs: { $objectToArray: "$fieldNameValues.v" } } },
        { $unwind: "$objs" },
        { $match: { "objs.k": loved_by_mom } }, 
        { $project: { fieldNameValues: 0, fldType: 0, objs: 0 } }
] )
0 голосов
/ 31 октября 2019

Я не знаю простой способ сделать то, что вы хотите.

В вашем случае я бы изменил способ вставки ваших документов в MongoDB:

db.test.insertMany ([
     {"_id": 1, "name": "Jimmy", "lovedBy": {"mom": true}},
     {"_id": 2, "name": "Andrew", "lovedBy": {"mom": false}},
     {"_id": 3, "name": "Nicholas", "lovedBy": {"mom": true}},
     {"_id": 4, "name": "Sarah", "lovedBy": {"dad": true}}
]);

Тогда вы могли бысделайте запрос следующим образом:

db.test.find({"lovedBy.mom" : {$exists: true}});

Важно всегда иметь структуру документа, которая позволяет запрашивать информацию более простым способом.

Хотя MongoDB позволяет вам иметь гибкую структуруЯ бы не рекомендовал использовать для каждого документа документы с уникальными полями.

Не имеет смысла, чтобы у каждого документа было уникальное поле, и вы хотите искать дочерние поля этих уникальных полей.

Таким образом, вы будете только мешать своей работе.

0 голосов
/ 31 октября 2019

строка $search из $text, этот запрос возвращает документы, которые содержат термин Loved by mom в проиндексированном поле темы, или, точнее, основанную на словах версию слова:

db.test.find( { $text: { $search: "Loved by mom" } } )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...