Как обновить массив объектов в другом массиве объектов с помощью mon goose? - PullRequest
0 голосов
/ 18 июня 2020

У меня проблема с MongoDB, Mon goose и Node.js.

У меня есть эта схема с использованием Mon goose:

const EmoteSchema = new mongoose.Schema({
    guild_id: String,
    users: [{
        user_id: String,
        emotes: [{
            emote: String,
            channels: [String],
            cooldown: Number,
            all_channels: { type: Boolean, default: true },
            global_cooldown: { type: Boolean, default: true },
            lock: { type: Boolean, default: false }
        }]
    }]
});

Как это выглядит MongoDB :

{
    "_id" : ObjectId("5ee6776b9277898982b0a25a"),
    "guild_id" : "714931095929618443",
    "users" : [
        {
            "_id" : ObjectId("5ee6776b9277898982b0a25b"),
            "user_id" : "160230784257622016",
            "emotes" : [
                {
                    "channels" : [ ],
                    "all_channels" : true,
                    "global_cooldown" : true,
                    "lock" : false,
                    "_id" : ObjectId("5ee6776b9277898982b0a25c"),
                    "emote" : "?"
                }
            ]
        }
    ],
    "__v" : 0
}

Я пытаюсь обновить базу данных на основе трех условий: при отправке информации о guild_id, user_id и эмоции:

  1. Если guild_id, user_id и emote существуют в базе данных, ничего не делают
  2. Если guild_id, user_id (и эмоции НЕ существуют), обновите массив эмоций новой эмоцией
  3. Если guild_id, (и user_id не существует), обновите массив пользователей новым user_id и обновите эмоцией
  4. Если guild_id не завершается: создайте новую запись с новым guild_id, массивом пользователей и массивом эмоций

Это то, что я пытался сделать:

        let filter = {
            guild_id: guild_inp,
            "users.user_id": user_inp
        };
        let update = {
            $push: { "users.$[i].emotes": { emote: emote_inp } } 
        };
        let options = {
            arrayFilters: [
                { "i.users.user_id": user_inp }
            ],
            rawResult: true
        };

        Emote.findOneAndUpdate(filter, update, options, fn);

Если guild_inp: 714931095929618443, user_inp: 160230784257622016 и эмоция: Функции обратного вызова получают следующий результат:

RES: {
  lastErrorObject: { n: 1, updatedExisting: true },
  value: {
    _id: 5ee6776b9277898982b0a25a,
    guild_id: '714931095929618443',
    users: [ [Object] ],
    __v: 0
  },
  ok: 1
}

Там написано, что обновили? Но я не вижу изменений в MongoDB!

Любая помощь приветствуется, если есть более простой способ достичь того, что я делаю, например, новая схема, поделитесь ею!

...