Как выбрать определенные суб-документы по критериям?

Имея вот такую схему статей с суб документами комментариев, нужно выбрать только определенных авторов

article: {
        text: {type: String, require: true},
        comments: [{
            text: {type: String, required: true},
            user_id: {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'users'
            }
        }],
        created_at: { type: Date,  "default": Date.now}
    },


Написал вот такой запрос
db.getCollection('article').findOne({
        '_id': ObjectId("564680c59bfd4a0a49745282"),
        'comments.user_id': {$in : [ObjectId("563e3337e2bf6c431b297d41"), ObjectId("563e3337e2bf6c431b297d42")]}
        })

ожидал увидеть комментарии только этих авторов, но вижу от всех. Видимо по 1 условию с Ид, монго вытаскивает все данные за эту статью, я пошел дальше, написал такой запрос

db.getCollection('article').find(
        {'_id': ObjectId("564680c59bfd4a0a49745282")},
        { comments : { $elemMatch: { user_id : {$in : [ObjectId("563e3337e2bf6c431b297d41"),ObjectId("563e3337e2bf6c431b297d42") ]}} } } 
        )

но так же все не корректно, возвращает только 1 запись

подскажите пожалуйста как решить эту на первый взгляд простую задачу.
  • Вопрос задан
  • 270 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Arik
если ничего не путаю, во втором запросе надо в качестве ключа указывать "хранилище" ('comments'), а не по чему ищем, а вот в $elemMatch уже говорим по чему, только уже просто 'user_id'
Ответ написан
@lega
Команда find предназначена для поиска самих документов, а не их содержимого (хотя там есть функции частичного получения). Поэтому, можно получать документы полностью и отфильтровывать уже на "клиенте", если отфильтровывать много то имеет смысл выделить комментарии в отдельную коллекцию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы