Написание запроса MongoDB для фильтрации на основе атрибутов ссылки?

1

Скажем, у меня есть набор документов под названием "собака", набор документов, называемых "владельцами", и ссылка на владельца из каждого документа собаки.

Например:

dog1:
{"_id": "abcdef0123456789",
 "name": "Rover",
 "owner": ObjectId("1234567890abcdef")}

owner1:
{"_id": "1234567890abcdef",
 "name": "Bob"}

Итак, учитывая этот пример, как мне найти всех собак, чей владелец называется "Боб".

Это существующая БД, поэтому я не могу изменить способ хранения данных. Я застрял в текущем формате.

  • 0
    Вы храните _id как строку в владельце коллекции?
  • 0
    @ thev0id Это идентификатор, назначенный Mongo при создании объекта. Так нет?
Теги:
python-3.x
aggregation-framework
pymongo

1 ответ

1

Вы можете попробовать ниже $lookup aggregation в mongodb 3.6 и выше

db.owner.aggregate([
  { "$match": { "name": "Bob" }},
  { "$lookup": {
    "from": "dogs",
    "let": { "ownerId": "$_id" },
    "pipeline": [{ "$match": { "$expr": { "$eq": ["$owner", "$$ownerId"] }}}],
    "as": "dogs"
  }}
])

или с $lookup 3.4 $lookup и выше

db.owner.aggregate([
  { "$match": { "name": "Bob" }},
  { "$lookup": {
    "from": "dogs",
    "localField": "_id",
    "foreignField": "owner",
    "as": "dogs"
  }}
])
  • 0
    Версия 3.4 все еще работает с 3.6? Потому что это выглядит намного проще.
  • 0
    Да, это будет работать и с 3.6
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню