Поле массива $ filter с использованием массива - PullRequest
0 голосов
/ 24 сентября 2018

запись моей коллекции для mongodb

{
  "_id" : ObjectId("5ba60b805f13dc37a5377302"),
  "clientID" : "5ba49a5b58db5fb63b282565",
  "propertyID" : "77f3d86a9842afa8ee7a64f3bf958ef4",
  "emod" : [ 
    {
        "audience" : "Mobile",
        "emodID" : "5ba5e0f47b07641eeebfad37",

     }, 
    {
        "audience" : "Laptop",
        "emodID" : "5ba5e0f47b07641eeebfad37",
    }, 
    {
        "audience" : "Games",
        "emodID" : "5ba5e0f47b07641eeebfad37"
    }]
}

запрос на поиск записи

var audienceList = ["Mobile","Laptop"];

predictionCollection.findOne({
    "clientID": '5ba49a5b58db5fb63b282565',
}, {
    emod: {
        $elemMatch: {
            'audience': {"$in":audienceList}
        }
    },

}).exec(function (err, predictionData) {

вывод для элементаpretionData

emod: [ { audience: 'Mobile', emodID: '5ba5e0f47b07641eeebfad37' } ] }

, но мне требуется вывод

emod: [ { audience: 'Mobile', emodID:'5ba5e0f47b07641eeebfad37' },
            { audience: 'Laptop', emodID:'5ba5e0f47b07641eeebfad37' }
    ] }

});

Я использую агрегацию Монго

Я также использовал $ elementMatch и $ in для сопоставления всего массива

1 Ответ

0 голосов
/ 24 сентября 2018

$elemMatch возвращает только первый элемент из массива.

Итак, вам нужно использовать $filter с $in оператор агрегации для извлечения всех элементовчто соответствует условию

db.collection.aggregate([
  { "$match": { "clientID": "5ba49a5b58db5fb63b282565" }},
  { "$project": {
    "emod": {
      "$filter": {
        "input": "$emod",
        "as": "em",
        "cond": { "$in": ["$$em.audience", ["Mobile", "Laptop"]] }
      }
    }
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...