Обновить поле документа несколькими вложенными документами - PullRequest
0 голосов
/ 09 января 2020

У меня есть существующий документ MongoDB, который содержит поле files (а также другие поля). Поле files является объектом, и теперь я хочу обновить это поле несколькими вложенными документами. Я успешно вставил один вложенный документ со следующим синтаксисом:

db.collection.updateOne(
    { "id": 1 },
    {
        $set: {
            "files":
            {
                "filename1": {
                    "a": "Lorem ipsum dolor",
                    "b": "Sit amet consectetur",
                    "c": "Adipiscing elit"
                }
            }
        }
    })

Затем я попытался вставить еще 2 документа одновременно в поле file, что не удалось

db.collection.updateOne(
    { "id": 1 },
    {
        $set: {
            "files":
            {
                "filename2": {
                    "d": "Lorem ipsum dolor",
                    "e": "Sit amet consectetur",
                    "f": "Adipiscing elit"
                }
            }
{
        "filename3": {
            "g": "Duis aute irure",
            "h": "Labore et dolore",
            "i": "Eiusmod tempor incididunt"
        }
    }
}})

После того, как это не сработало, я попытался вставить записи одну за другой, используя первый блок кода, но вставив filename2 (я не хотел перезаписывать существующие filename1). Этот документ был вставлен в объект files, но переписал существующий документ filename1. Я пробовал несколько разных вариантов, но ничего не помогло.

Любая обратная связь / помощь относительно того, как вложить несколько документов в поле, будет полезной.

1 Ответ

0 голосов
/ 10 января 2020

Это не сработало, потому что в вашем запросе на обновление мало проблем, проверьте это:

db.collection.updateOne(
    { "id": 1 },
    {
        $set: {
            "files":
            {
                "filename2": {
                    "d": "Lorem ipsum dolor",
                    "e": "Sit amet consectetur",
                    "f": "Adipiscing elit"
                },
                "filename3": {
                    "g": "Duis aute irure",
                    "h": "Labore et dolore",
                    "i": "Eiusmod tempor incididunt"
                }
            }
        }
    })

Вышеупомянутый запрос будет работать, но здесь есть проблема - он заменит существующее поле files на отправляется новое files, поскольку вы используете $set, который заменит существующее поле новым значением (если старое значение отличается от нового значения).

Если files - это массив, вы можете используйте $push или $addToSet для добавления новых значений в существующее поле files (тогда вы просто замените $set на одно из них, это будет работать), но если вы хотите, чтобы files в качестве объекта, либо вам нужно прочитать его и ввести новые значения, используя нотацию . в коде, и записать все files обратно в MongoDB, используя $set, то есть два вызова БД. Другим способом вы можете сделать это за один вызов БД следующим образом:

db.updateObject.updateOne({"id": 1}, {
    $set: {
       /** Same like programming language you use `.`,
           You're not replacing files rather you're adding new objects to files,
           If 'files.filename2' already exists in DB then it would be updated. */
        'files.filename2': {
            "d": "Lorem ipsum dolor",
            "e": "Sit amet consectetur",
            "f": "Adipiscing elit"
        }, 'files.filename3': {
            "g": "Duis aute irure",
            "h": "Labore et dolore",
            "i": "Eiusmod tempor incididunt"
        }
    }
})

, который обновит объект files двумя новыми объектами в нем:

/* 1 */
{
    "_id" : ObjectId("5e179dac627ef7823643cd97"),
    "id" : 1,
    "files" : {
        "filename1" : {
            "a" : "Lorem ipsum dolor",
            "b" : "Sit amet consectetur",
            "c" : "Adipiscing elit"
        },
        "filename2" : {
            "d" : "Lorem ipsum dolor",
            "e" : "Sit amet consectetur",
            "f" : "Adipiscing elit"
        },
        "filename3" : {
            "g" : "Duis aute irure",
            "h" : "Labore et dolore",
            "i" : "Eiusmod tempor incididunt"
        }
    }
}
...