Учитывая эту коллекцию:
/* 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'] }}}
} },
С помощью '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', чтобы пересечь элемент'. Я также попробовал разные комбинации 'single-сравнение' vs' $ in' – Basil
Похоже, что он решает массив. Нам нужно рассмотреть вопрос о добавлении запроса для разрешения на одно значение массива. Подумайте о добавлении фильтра, который спроецирует значение внешнего массива, а затем ссылается на одну внутреннюю роль с помощью оператора позиционирования. Добавлено несколько примеров, основанных на документах. Посмотрите, поможет ли это вам – Veeram