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
как вариант) и содержит соответствующие документы из адресов коллекции. Если указанное имя уже существует во входном документе, существующее поле перезаписывается.
Вы можете сделать это только на уровне приложения - то есть собрать всех пользователей в одном запросе, получить все адреса в другом и склеить их вместе. Монго не делает то, что вы просите.