0

У меня есть следующая схема:Как фильтр массив элементов объектов mongoose?

User: { 
    age: Number, 
    name: String, 
    comments: { 
    added: Date, 
    body: String 
    } 
} 

Мне нужно получить все пользователи, с комментариями добавил более настраиваемой даты.

Пример данных:

[{ 
    "name": "John", 
    "age: 21, 
    "comments": [{ 
    "added": 21-01-12, 
    "body": "blabla1"  
    }, { 
    "added": 21-02-12, 
    "body": "blabla2"  
    }, { 
    "added": 21-01-10, 
    "body": "blabla3" 
    }] 
}, { 
    "name": "Bruno", 
    "age: 33, 
    "comments": [{ 
    "added": 21-01-10, 
    "body": "ololo1"  
    }, { 
    "added": 21-02-12, 
    "body": "ololo2"  
    }, { 
    "added": 21-01-09, 
    "body": "ololo3" 
    }] 
}] 

мне нужны все пользователи со всеми комментариями больше чем 01-01-11 без комментариев меньше, чем эта дата.

Ожидаемый результат:

{ 
    "name": "John", 
    "age: 21, 
    "comments": [{ 
    "added": 21-01-12, 
    "body": "blabla1"  
    }, { 
    "added": 21-02-12, 
    "body": "blabla2"  
    }] 
}, { 
    "name": "Bruno", 
    "age: 33, 
    "comments": [{ 
    "added": 21-02-12, 
    "body": "ololo2"  
    }] 
} 

Как я могу идти об этом?

+0

посмотрите на [$ фильтра] (https://docs.mongodb.com/manual/reference/operator/aggregation/filter/) – felix

+0

это правильный фильтр, но в результате у меня есть все пользователи, с пустыми комментариями и т. д., но я хочу только пользователей с необходимыми комментариями – Jackson

+0

Пожалуйста, добавьте запрос, который у вас есть – felix

ответ

0
const findQuery = [ 
    {$unwind: "$comments" }, 
    {$match: {"comments.added": {$gt: lastUpdate} } }, 
    {$group: {_id: "$_id", comments: {$push: "$comments"} } } 
]; 

User.aggregate(findQuery) 
0

Чтобы отфильтровать поле даты в Mongoose (и mongo), вам нужно использовать $ gte, $ gt, $ lt, $ lte. В вашем конкретном примере вам нужно $ gte (больше или равно)

Итак, если ваша модель - Пользователь User.find ({comments.added: {$ gte: new Date (2011, 1, 1)} }, функция (ошибка, комментарии) {

});

За исключением, если есть несколько причин, я могу предложить вам предпочесть ISODate, которые являются более точными, и вы делаете то же самое, чтобы фильтровать записи

миль в час

+0

Я использую isodate, это для быстрого примера. Другие комментарии (с датой $ lt: new Date (2011, 1, 1)) не будут в результате? – Jackson

+0

Просто сделал против моей базы данных MongoDB, используя ISODate: User.find ({comments.add: {$ gte: new ISODate ("2011-01-01T00: 00: 00.000Z")}}, function (err, entries) { –

+0

Я делаю это, но в результате у меня есть пользователи со всеми комментариями, но я хочу получать комментарии только в формате $ gt. Но в результате у меня есть все комментарии ( – Jackson