Обновите вложенный массив в mon goose, используя javascript методы массива - PullRequest
0 голосов
/ 13 апреля 2020

У меня проблемы с обновлением поля mixed type в схеме mon goose. Это не лучшая настройка схемы, но у меня есть причины для ее настройки. Теперь я хочу выполнить javascript array-like таких операций, как push. Я хочу получить доступ к индексу текущего do c, повторяемого во вложенных массивах, в поле tags. Примерно так:

Пн goose схема

let user = {
    name : String,
    email : String,
    tags : []
}

Поле tags создается динамически при создании пользователя, и в результате я получил что-то подобное после вставки пользователя в базу данных

tags : [ 
        [{obj1}, {obj2}, {obj3}, ...], 
        [...], 
        [...], 
        [...], 
        [...] 
    ]

Чего я хочу достичь - pu sh новый документ для вложенного массива "javascript way"

user.tags[0].forEach(obj, index){
    // Do some operations here with obj and index
    // I don't know how to update a nested array with the mongo $push operator that is why I am falling back to the `js array push` method

    let newObj = { foo: bar }
    user.tags[0].push(newObj)
    user.save()
}

После тестирования с почтальоном, он показывает, что операция прошла успешно и возвращает вставленный элемент, но я наблюдаю две проблемы:

  1. Он не постоянен в БД, но в то же время мой ответ на почтальон выглядит так:
{
    name : bar,
    email : foo,
    tags : [
        [{ foo : bar}], // from the last push operation I did
        [],
        [],
        []...
        ...
    ]
}
Последующие push операции с любым индексом массива (например, 0-м индексом) заменяют текущий объект вместо его добавления: user.tags[0].push(obj) ===> это заменяет первый объект (в ответе почтальона, конечно, а не в БД, потому что это кажется, не является постоянным)

Любая помощь в достижении этого будет высоко оценена

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

1 Ответ

0 голосов
/ 14 апреля 2020

Я наконец нашел решение здесь: Форум Freecodecamp

Мне не хватало строки user.markModified("nameOfFieldToUpdate"). После добавления этой строки, прежде чем user.save() решит проблему.

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