2016-11-02 3 views
0

Учитывая эту коллекцию:

/* 1 */ 
{ 
    "_id" : "123", 
    "username" : "test", 
    "roles" : [ 
     { 
      "contextId" : "context1", 
      "roles" : [ 
       "Read", 
       "SpecificRole", 
       "OtherRole" 
      ] 
     }, 
     { 
      "contextId" : "context3", 
      "roles" : [ 
       "Read", 
       "SpecificRole" 
      ] 
     } 
    ] 
} 

/* 2 */ 
{ 
    "_id" : "456", 
    "username" : "admin", 
    "roles" : [ 
     { 
      "contextId" : "context1", 
      "roles" : [ 
       "Write", 
       "Read" 
      ] 
     } 
    ] 
} 

я могу найти с:

db.User.find({ 
    'roles': { 
     $elemMatch: { 
      'roles': 'SpecificRole' 
     } 
    } 
}) 

Я хочу удалить только этот «SpecificRole» из своего собственного массива, ничего , Однако, если я пытаюсь удалить роль:

db.User.update(
    { }, 
    { $pull: { 
    'roles': { 'roles': { $in: ['SpecificRole'] }} 
    } }, 
    { multi: true } 
) 

Затем он очищает весь массив «ролей», в результате чего:

{ 
    "_id" : "123", 
    "username" : "testuser", 
    "roles" : [] 
} 

Если я пытаюсь с $ elemMatch, он говорит, что он обновляется каждая запись в БД, но ни изменены:

{ $pull: { 
    'roles': { $elemMatch: { 'roles': { $in: ['SpecificRole'] }}} 
    } }, 

ответ

0

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

Пример 1: Фильтр contextId: 'context3' уникально идентифицирует внешнюю роль.

db.User.update({ 
    'roles': { 
     '$elemMatch': { 
      'contextId': 'context3', 
     } 
    } 
}, { 
    '$pull': { 
     'roles.$.roles': { 
      $in: ["SpecificRole"] 
     } 
    } 
}, { 
    multi: true 
}) 

Пример 2: Фильтр ContextID: 'context1' вместе с '_id': '123' однозначно идентифицирует внешнюю роль.

db.User.update({ 
    '_id': '123', 
    'roles': { 
     '$elemMatch': { 
      'contextId': 'context1', 
     } 
    } 
}, { 
    '$pull': { 
     'roles.$.roles': { 
      $in: ["SpecificRole"] 
     } 
    } 
}, { 
    multi: true 
}) 
+0

С помощью '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', чтобы пересечь элемент'. Я также попробовал разные комбинации 'single-сравнение' vs' $ in' – Basil

+0

Похоже, что он решает массив. Нам нужно рассмотреть вопрос о добавлении запроса для разрешения на одно значение массива. Подумайте о добавлении фильтра, который спроецирует значение внешнего массива, а затем ссылается на одну внутреннюю роль с помощью оператора позиционирования. Добавлено несколько примеров, основанных на документах. Посмотрите, поможет ли это вам – Veeram

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