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

Мои данные mongodb немного похожи на массив из массива.

{
"_id" : ObjectId("5e36950f65fae21293937594"),
"userId" : "5e33ee0b4a3895a6d246f3ee",
"notes" : [ 
    {
        "noteId" : ObjectId("5e36953665fae212939375a0"),
        "time" : ISODate("2020-02-02T17:24:06.460Z"),
        "memoryLine" : [ 
            {
                "_id" : ObjectId("5e36953665fae212939375ab"),
                "memoryTime" : ISODate("2020-02-03T17:54:06.460Z"),
                "hasReviewed": false
            }, 
            {
                "_id" : ObjectId("5e36953665fae212939375aa"),
                "memoryTime" : ISODate("2020-02-03T05:24:06.460Z"),
                "hasReviewed": false
            }
        ]
    }
]}

Я хочу обновить hasReviewed в memoryLine с помощью _id. Например, я хочу обновить _id:ObjectId(5e36953665fae212939375ab) item's имеетОтзывы к истина . Как и ожидалось, как показано ниже:

{
"_id" : ObjectId("5e36950f65fae21293937594"),
"userId" : "5e33ee0b4a3895a6d246f3ee",
"notes" : [ 
    {
        "noteId" : ObjectId("5e36953665fae212939375a0"),
        "time" : ISODate("2020-02-02T17:24:06.460Z"),
        "memoryLine" : [ 
            {
                "_id" : ObjectId("5e36953665fae212939375ab"),
                "memoryTime" : ISODate("2020-02-03T17:54:06.460Z"),
                "hasReviewed": true    <============here updated to true
            }, 
            {
                "_id" : ObjectId("5e36953665fae212939375aa"),
                "memoryTime" : ISODate("2020-02-03T05:24:06.460Z"),
                "hasReviewed": false
            }
        ]
    }
]}

Как с этим бороться? Спасибо.

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Вы можете использовать arrayFilters in .updateOne () , чтобы сделать это:

db.collection.update({ 'notes.memoryLine._id': ObjectId("5e36953665fae212939375ab") },
    { $set: { "notes.$[].memoryLine.$[element].hasReviewed": true } },
    { arrayFilters: [{ "element._id": ObjectId("5e36953665fae212939375ab") }] })

Примечание: С memoryLine - это массив внутри объекта из примечаний массива, тогда этот notes.$[] обновит все объекты memoryLine.hasReviewed до true при совпадении критериев в В другом случае, если вы хотите обновить только первый соответствующий объект, вы можете использовать notes.$. Также вместо .updateOne() вы можете использовать .updateMany() для обновления нескольких документов.

0 голосов
/ 06 февраля 2020

Я нашел решение для этого.

db.notes.updateOne({
    userId:"5e33ee0b4a3895a6d246f3ee",
    'notes.0.memoryLine._id': ObjectId("5e36953665fae212939375ab"),
}, {
    '$set': {
        'notes.0.memoryLine.$.hasReviewed': true
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...