#mongodb #mongodb-query
#mongodb #mongodb-запрос
Вопрос:
У меня есть коллекция с документами, подобными этой:
{
"date" : 20200817,
"items" : [
{
"name" : "item1", "values" : ["val1", "val2", "val3", "val4"]
},
{
"name" : "item2", "values" : ["val1", "val4"]
},
{
"name" : "item3", "values" : ["val1", "val3"]
}
]
}
Я хочу получить список name
из items
, val3
который values
существует в, как это
['item1', 'item3']
У меня есть этот запрос :
db.test.find({
'dateM': 20200817,
'items': {
'$elemMatch':{
'values':{
'$elemMatch':{
$in:['val3']
}
}
}
}
}, {'lists.name': 1})
но я получаю список имен всех элементов.
Где мой запрос неверен?
Что я могу сделать?
Спасибо
Ответ №1:
Вам нужно использовать агрегацию там. Это один из способов, которым вы можете достичь
[
{
$project: {
output: {
$map: {
input: {
$filter: {
input: "$items",
cond: {
$in: [
"val3",
"$$this.values"
]
}
}
},
in: "$$this.name"
}
}
}
}
]
Работает игровая площадка Mongo
Ответ №2:
Ваш запрос должен возвращать только документы, которые содержат хотя бы один элемент с val3
.
Если достаточно вернуть только первый соответствующий элемент, вы используете проекционную форму $elemMatch, в противном случае вам нужно будет либо использовать агрегацию, либо фильтровать массив на стороне клиента.