Что вы хотите сделать, это в основном фильтрация подматрицы в mongodb. Вокруг находится similar questions.
Вы не можете сделать это с помощью .find()
, но вы можете достичь этого с помощью агрегации.
Самый простой способ будет использовать $ фильтр
В вашем случае, пожалуйста, попробуйте это (доступно начиная с MongoDB против 3,2.):
var currentDate = new Date();
var effectiveToCondition = {
$elemMatch: {
$or: [
{effectiveTo: {$gt: currentDate}},
{effectiveTo: null}
]
}
};
db.user.aggregate([
{
$match: {
$and: [
{
$or: [
{roles: {$size: 0}},
{roles: effectiveToCondition}
]
},
{
$or: [
{groups: {$size: 0}},
{groups: effectiveToCondition}
]
}
]
}
},
//Will filter out the records where groups AND rolse are both empty
//Please uncomment if needed
// {
// $match: {
// $or: [
// {'groups.0': {$exists: true}},
// {'roles.0': {$exists: true}}
// ]
// }
// },
{
$project: {
user: '$$ROOT',
filteredRoles: {
$filter: {
input: '$roles',
as: 'role',
cond: {
$or: [
{$gt: ['$$role.effectiveTo', currentDate]},
{$not: {$ifNull: ['$$role.effectiveTo', false]}}
]
}
}
},
filteredGroups: {
$filter: {
input: '$groups',
as: 'group',
cond: {
$or: [
{$gt: ['$$group.effectiveTo', currentDate]},
{$not: {$ifNull: ['$$group.effectiveTo', false]}}
]
}
}
}
}
}]);
Вы будете иметь 'user' с исходным документом и двумя дополнительными свойствами: filterGroups и filtersRoles.
вместо поиска удалять. проверьте эту ссылку https://docs.mongodb.com/manual/reference/method/db.collection.remove/ –
этот выше запрос возвращает весь массив элементов массива, где effectiveTo дата не больше текущей даты, те, которые я хочу удалить .. –
@MohitJain, спасибо, но я не хочу удалять элементы моего массива, нужно только отображать, чтобы показать на портале ... нужно сохранить все записи .. –