MongoDB - обновить поле в объекте массива с несколькими условиями фильтрации - PullRequest
0 голосов
/ 18 января 2020

Если у меня есть следующий документ в моей базе данных:

{
    "_id" : MainId,
    "subdoc" : [
        {
            "_id" : SubdocId,
            "userid" : "someid",
            "toupdate": false,
        },
        {
            "_id" : SubdocId2,
            "userid" : "someid2",
            "toupdate": false,
        }       
    ],
    "extra" : [
        "extraid1",
        "extraid2"
    ]
}

Как мне обновить поддокумент SubdocId2, где должен совпадать идентификатор (SubdocId2) и идентификатор пользователя любого SubdocId2 равен "someid2" ИЛИ значение "extraid1" существует в "extra"?

Самое дальнее, что я получил:

db.coll.update({
"subdoc._id":"SubdocId2", {
    $or: ["extra":{$in:["extraid1"]}, "subdoc.userid":"someid2"]
    }
}, {"subdoc.$.toupdate":true})

Возможно, я забыл процитировать что-то, но я получаю ошибку (SyntaxError: invalid property id)

1 Ответ

1 голос
/ 18 января 2020

Пожалуйста, попробуйте это:

db.coll.update(
    {
        $and: [{ "subdoc._id": SubdocId2 }, {
            $or: [{ "extra": { $in: ["extraid1"] } },
            { "subdoc.userid": "someid2" }]
        }] // subdoc._id && (extra || subdoc.userid)
    }, { $set: { "subdoc.$.toupdate": true } })

В вашем запросе есть пара синтаксических проблем, а также, если вы не используете $set в своей части обновления - он заменяет весь документ на "subdoc.$.toupdate": true , Конечно, если вы используете mongoose, это другой сценарий, так как mon goose внутренне добавит $set, но при выполнении в оболочке или любом клиенте вам нужно указать $set. Также, если SubdocId2 равно ObjectId(), вам необходимо преобразовать string в ObjectId() в коде перед запросом базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...