Mongo db, используя результат запроса в другом запросе, используя $in

У меня есть следующая модель в Монго БД:

Коллекция пользователей

{
_id:12345,
name:15,
age:"Joe",
}

Коллекция адресов

{
_id:7663,
userId:12345,
Street:"xyz",
number:"1235",
city:"New York",
state:"NY"
}

Теперь я хочу получить все адреса пользователей старше 20 лет. Я подумал о том, чтобы запросить все идентификаторы пользователей старше 20 лет, и в результате этого запроса используйте оператор $ in, чтобы найти адреса.

У меня вопрос, есть ли способ превратить это в один запрос? Есть ли лучший способ сделать запрос? (obs: это только пример, с моей проблемой я не могу встраивать адреса в пользователей)

3 ответа

В оболочке Mongo вы можете использовать результат одного запроса в другом. Например:

use database  // the name of your database
db.coll1.find({_id:{$nin:db.coll2.distinct("coll1_id")}})

Здесь коллекция coll1 содержит поле _id. Затем вы можете проверить любые идентификаторы, которых нет в списке coll2 коллекции в поле coll1_id. Так что это способ очистить две таблицы, если у вас есть записи в coll1, которые не имеют ссылки через поле coll1_id в coll2.

Другой подход делает то же самое:

use database  // the name of your database
temp = db.coll2.distinct("coll1_id");
db.coll1.find({_id:{$nin:temp}})

Первый пример делает это одной командой, второй - двумя, но концепция та же. Использование результатов одного запроса в другом. Много разных способов сделать это. Кроме того, метод.toArray() может быть полезен для создания массивов, если вы делаете больше, чем просто используете Different().

Используйте структуру агрегирования, где $lookup Этап конвейера обеспечивает функциональность для объединения двух коллекций:

db.user.aggregate([
    { "$match": { "age": { "$gt": 20 } } },
    {
        "$lookup": {
            "from": "addresses",
            "localField": "_id",
            "foreignField": "userId",
            "as": "address"
        }
    }
])

Выше создаст новое поле массива с именем address (как указано в $lookup как вариант) и содержит соответствующие документы из адресов коллекции. Если указанное имя уже существует во входном документе, существующее поле перезаписывается.

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