как обновить элемент массива в Mongodb с помощью оболочки mongo

avatar
Manu Chadha
7 апреля 2018 в 22:24
30
1
0

У меня есть следующий документ

    { "_id" : ObjectId("5ac94112d99fefa76215853a"),
     "id" : "4969c4b2-afbf-4fba-bbb3-95a6899b446d", 
    "profiles" : [ { "loginInfo" : { "providerID" : "credentials",
     "providerKey" : "mc1@mc.com" }, "confirmed" : false,
     "email" : "mc1@mc.com", "firstName" : "m1", 
    "lastName" : "c1", "fullName" : "m1 c1", 
    "passwordInfo" : { "hasher" : "bcrypt", 
"password" : "$2a$10$5F62Gza9Z1ic7OabtXAQEeZhPqm7dfQfjlMMReI64cSZ8q0LJ3HQa" } } ]}

Я хочу изменить значение поля confirmed с false на true, используя оболочку mongo. Я попробовал следующую команду, но она не удалась. Что я делаю не так?

db.users.update({id:"4969c4b2-afbf-4fba-bbb3-95a6899b446d"}, {$set: {'profiles.confirmed': true}});

Ошибка

WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 16837,
                "errmsg" : "cannot use the part (profiles of profiles.confirmed) to traverse the element ({profiles: [ { loginInfo: { providerID: \"credentials\", providerKey: \"mc1@mc.com\" }, confirmed: false, email: \"mc1@mc.com\", firstName: \"m1\", lastName: \"c1\", fullName: \"m1 c1\", passwordInfo: { hasher: \"bcrypt\", password: \"$2a$10$5F62Gza9Z1ic7OabtXAQEeZhPqm7dfQfjlMMReI64cSZ8q0LJ3HQa\" } } ]})"
        }
})
>
Источник
mszymborski
7 апреля 2018 в 22:30
0

Используйте profiles.$[].confirmed для обновления всех профилей или определенного индекса в противном случае — вы также просматриваете массив между этими двумя поддокументами. Имейте в виду, что это может не работать на старых серверах mongo.

Manu Chadha
7 апреля 2018 в 22:32
0

пробовал `db.users.update({id:"4969c4b2-afbf-4fba-bbb3-95a6899b446d"}, {$set: {'profiles.$[].confirmed': true}});`. Это не сработало. Я использую версию 3.6.2

mszymborski
7 апреля 2018 в 22:36
0

Интересно, на самом деле это исправление для 3.5.x: jira.mongodb.org/browse/SERVER-1243 хотя я немного устал и мог что-то пропустить

Manu Chadha
7 апреля 2018 в 22:37
1

завтра утром :) Спокойной ночи!

Ответы (1)

avatar
Rubin Porwal
8 апреля 2018 в 10:05
0
db.users.update({
    id: "4969c4b2-afbf-4fba-bbb3-95a6899b446d",
    "profiles": {
        $elemMatch: {
            confirmed: false
        }
    }
}, {
    $set: {
        'profiles.$.confirmed': true
    }
});
Maximilian Peters
8 апреля 2018 в 12:14
0

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе.

Manu Chadha
8 апреля 2018 в 12:57
0

Спасибо. Это сработало. Я согласен с Максимилианом, что было бы полезно, если бы вы могли объяснить, что я делаю неправильно и как работает ваше решение.

Rubin Porwal
9 апреля 2018 в 05:34
0

Спасибо @ManuChadha за принятие моего ответа. В приведенном выше запросе на обновление мы использовали оператор $elemMatch для фильтрации значений в массив.