Есть ли способ использовать недавно полученное значение для поиска другого? в MongoDB - PullRequest
1 голос
/ 04 августа 2020

Я хочу сделать запрос и использовать полученное значение для поиска другого в том же запросе. Моя коллекция выглядит так:

{
"houses": {
    123: {
      "color": "white",
      "location": "California"
    },
    124: {
      "color": "blue",
      "location": "Las Vegas"
   }
},
"owners": {
   "Anne": {
     "house": 124,
   },
   "Jake": {
     "house": 123
   }
 }
}

Перед выполнением запроса я буду знать только имя владельца, и я хотел бы получить информацию о доме (цвет, местоположение).

What Я спрашиваю, есть ли способ использовать номер дома для получения информации о доме в том же запросе. Примерно так:

db.collection.aggregate([
  {'$project' {'houses': 1, 'house_number': '$owners.Anne.house'}}, 
  {'$project': {'house_info': 'houses.$house_number':1}}
])

Я попытался сделать номер дома строкой и связать его с $ homes, но mon go не позволяет мне объединить символ $. Я избегаю делать два запроса: один для получения номера дома, а второй - для получения информации о доме.

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

1 Ответ

2 голосов
/ 04 августа 2020

Вполне возможно с использованием операторов $objectToArray и $filter. $ ObjectToArray предназначен для преобразования объекта / документа домов в массив свойств типа ключ / значение. С помощью этого массива вы можете фильтровать, используя значение '$ owner.Anne.house'.

Возьмем, к примеру, этот агрегированный конвейер:

db.collection.aggregate([
        { '$project': {
            'house_info': {
            '$filter': {
                'input': { '$objectToArray': '$houses' },
                'cond': {
                    '$eq': ['$owners.Anne.house', '$$this.k']
                    }
                }
            }
        } }
])

Результат будет примерно таким:

{
    'house_info': [
        {
            k: '124',
            v: {
                "color": "blue",
                "location": "Las Vegas"
            }
        }
    ]
}

Чтобы получить только документ данных

{
    "color": "blue",
    "location": "Las Vegas"
}

Добавьте следующий этап конвейера проекции, который использует оператор $arrayElemAt как

db.collection.aggregate([
    { '$project': {
        'house_array': {
        '$filter': {
            'input': { '$objectToArray': '$houses' },
            'cond': {
                '$eq': ['$owners.Anne.house', '$$this.k']
                }
            }
        }
    } },
    { '$project': {
        'house_info': {
            '$arrayElemAt':  ['$house_array', 0]
        }
    } }
])
...