Запрос MongoDB для поиска только совпадающих элементов вложенного массива

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

У меня есть коллекция с документами, подобными этой:

 {
    "date" : 20200817,
    "items" : [ 
        {
            "name" : "item1", "values" : ["val1", "val2", "val3"], "values2" : ["val21", "val22", "val23"]
        }, 
        {
            "name" : "item2", "values" : ["val1", "val4"]
        }, 
        {
            "name" : "item3", "values" : ["val1", "val3"], "values2" : ["val31", "val33"]
        }
    ]
}
  

Я хочу получить values и values2 из items этого name , item3 вот так

{"values" : ["val1", "val3"], "values2" : ["val31", "val33"]}

У меня есть этот запрос :

 db.test.find(
   {'items.name': 'item3'}, {'items.$.values': 1, 'items.$.values2': 1})
  

но я получаю эту ошибку

Cannot specify more than one positional proj. per query.

Где мой запрос неверен?

Что я могу сделать?

Спасибо

Комментарии:

1. вы не можете с помощью find(), но вы можете сделать этот способ, в противном случае вам нужно использовать aggregate()

Ответ №1:

 //data set queried here for clarity
> db.items5.find().pretty();
{
        "_id" : ObjectId("5f5109ef3372ab5da3a605ba"),
        "date" : 20200817,
        "items" : [
                {
                        "name" : "item1",
                        "values" : [
                                "val1",
                                "val2",
                                "val3"
                        ],
                        "values2" : [
                                "val21",
                                "val22",
                                "val23"
                        ]
                },
                {
                        "name" : "item2",
                        "values" : [
                                "val1",
                                "val4"
                        ]
                },
                {
                        "name" : "item3",
                        "values" : [
                                "val1",
                                "val3"
                        ],
                        "values2" : [
                                "val31",
                                "val33"
                        ]
                }
        ]
}
//actual MongoDB query and query output using aggregate
> db.items5.aggregate([
... {$unwind:"$items"},
... {$match:{"items.name":"item3"}},
... {$project:{"items.values":1,
...            "items.values2":2}}
... ]).pretty();
{
        "_id" : ObjectId("5f5109ef3372ab5da3a605ba"),
        "items" : {
                "values" : [
                        "val1",
                        "val3"
                ],
                "values2" : [
                        "val31",
                        "val33"
                ]
        }
}
>