Как реализовать операцию $in в агрегации $filter в MongoDB

Я пытаюсь отфильтровать данные во вложенном массиве. Мои данные, как показано ниже:

{
    "_id" : ObjectId("5836afca6dbd62de8d654h9"),
    "name" : "First Test Event",
    "registered_users" : [ 
        {
            "user_id" : ObjectId("5836e433e17ea92ea7a499a5"),
            "user_name" : "Malavika",            
            "user_state" : "registered"
        }, 
        {
            "user_id" : ObjectId("5836e433e17ea92ea7a455b5"),
            "user_name" : "Piyush",            
            "user_state" : "joined"
        },
        {
            "user_id" : ObjectId("58369783e17e6e63c35f36ac"),
            "user_name" : "Jingi",
            "user_state" : "notified"
        }
    ]
},
{
    "_id" : ObjectId("5836afca6dbd62de8d622b3"),
    "name" : "Test Event",
    "registered_users" : [ 
        {
            "user_id" : ObjectId("5836e433e17ea92ea7a499a5"),
            "user_name" : "Malavika",            
            "user_state" : "registered"
        }, 
        {
            "user_id" : ObjectId("5836e433e17ea92ea7a455b5"),
            "user_name" : "Piyush",            
            "user_state" : "left"
        },
        {
            "user_id" : ObjectId("58369783e17e6e63c35f36ac"),
            "user_name" : "Jingi",
            "user_state" : "notified"
        }
    ]
}

в приведенной выше коллекции я хочу получить только «registered_users» первого события «First Test Event» в двух состояниях «зарегистрировано, присоединилось».

Мой предполагаемый результат должен быть:

{
    "registered_users" : [ 
        {
            "user_id" : ObjectId("5836e433e17ea92ea7a499a5"),
            "user_name" : "Malavika",
            "user_state" : "registered"
        }, 
        {
            "user_id" : ObjectId("58369783e17e6e63c35f36ac"),
            "user_name" : "Piyush",
            "user_state" : "joined"
        }
    ]
}

Итак, я подготовил запрос, как показано ниже:

db.events.aggregate([   
{$match: {'registered_users.user_state': 'registered', "_id": ObjectId("5836afca6dbd62de8d654h9")}},
   {$project: {
        registered_users: {$filter: {
            input: '$registered_users',
            as: 'register',
            cond: {$eq: ['$$register.user_state', 'registered']}
        }},
        _id: 0,
        name: 0
    }}
])

Проблема с приведенным выше запросом заключается в том, что вместо одного состояния «зарегистрировано» мне нужен оператор $in для нескольких состояний «зарегистрировано», «присоединено», «оставлено» и т. д.....

Может ли кто-нибудь помочь мне в этом?


person Kiran    schedule 26.11.2016    source источник
comment
Взгляните на этот stackoverflow.com/a/40701688/2683814   -  person s7vr    schedule 26.11.2016
comment
Привет, я уже посмотрел на $setIsSubset. Но я не могу передать ему несколько значений, таких как «зарегистрированный», «присоединился», «левый» и т. д. В указанном вами решении я использую mongodb 3.2.7, и для этой версии я не могу установить переменная «значения». @Вирам   -  person Kiran    schedule 27.11.2016
comment
Попробуйте что-нибудь подобное "cond": { "$setIsSubset": [ [ "$$register.user_state" ], ["registered", "joined" ] ] }   -  person s7vr    schedule 27.11.2016
comment
Вау, это сработало потрясающе. Спасибо за помощь. Есть ли возможность, что я могу добавить сортировку к этому? как сортировать по user_state asc? А также, пожалуйста, предоставьте свое решение $setIsSubset в ответ. Чтобы я мог это принять.   -  person Kiran    schedule 27.11.2016
comment
В указанном вами решении я использую mongodb 3.2.7, и для этой версии я не могу установить переменную 'values'. Что ты имеешь в виду? почему нельзя объявить переменную так: let values = ["registered", "joined" ] или var values = ["registered", "joined" ]? Также обратите внимание на comment @Veeram, что вы нашли удивительным именно то, что делает ответ, и даже больше. И последнее, и не менее важное: если у вас есть какие-либо другие вопросы, рассмотрите возможность задать новый вопрос.   -  person styvane    schedule 27.11.2016