У меня проблема с 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 и эмоции:
- Если guild_id, user_id и emote существуют в базе данных, ничего не делают
- Если guild_id, user_id (и эмоции НЕ существуют), обновите массив эмоций новой эмоцией
- Если guild_id, (и user_id не существует), обновите массив пользователей новым user_id и обновите эмоцией
- Если 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!
Любая помощь приветствуется, если есть более простой способ достичь того, что я делаю, например, новая схема, поделитесь ею!