2017-02-21 3 views
0

У меня есть массив элементов при выборе данных из mongo с помощью $ elemmatch с $ или или $ all, а затем возвращает весь элемент, где условие не совпадает.Как удалить запись массива в mongodb, где условие не соответствует

db.user.find({$and: [{ 
    roles: { $all: [ 
     { "$elemMatch" : {$or:[{ effectiveTo: { $gt: new Date()} } , { effectiveTo: null }]}} 
    ]} 
}, 
{ 
    groups: { $all: [ 
     { "$elemMatch" : {$or:[{ effectiveTo: { $gt: new Date()} } , { effectiveTo: null }]}} 
    ]} 
}]}) 
+0

вместо поиска удалять. проверьте эту ссылку https://docs.mongodb.com/manual/reference/method/db.collection.remove/ –

+0

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

+0

@MohitJain, спасибо, но я не хочу удалять элементы моего массива, нужно только отображать, чтобы показать на портале ... нужно сохранить все записи .. –

ответ

0

Что вы хотите сделать, это в основном фильтрация подматрицы в 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.

+0

он не работает, возвращает 0 элементов в отфильтрованных группах и отфильтрован. Роболезный объект, когда есть элементы. –

+0

@RahulGour Не могли бы вы предоставить документ, который должен работать, но он не работает? t, поэтому я смогу проверить. Вы можете использовать http://jsbin.com/ –

+0

слишком долго, не можете добавить комментарии, можете ли вы сказать мне другим способом или как добавить в него фрагмент? –

Смежные вопросы