簡體   English   中英

Mongoose:無法將數據保存到空 Object

[英]Mongoose: Unable To Save Data To Empty Object

這是我的情況:

我有一個簡單的架構,它有一個 object 調用命令,我最初設置為{}

commands:{}

當我將文檔添加到數據庫時,我遍歷了一個命令文件,並通過執行command["command"] = "blah blah"; . 我這樣做的方式如下(我工作的代碼很舊):

Guild.findOne({guildId:serverId}).then(x=>{
  x.commands = {};
  for(let command of Object.values(commandInfo)){
    if(!command.name) continue;
    const getSubs = ()=>{
      const subArray = {};
      if(!command.subCommands) return;
      for(let subs of Object.values(command.subCommands)){
        subArray[subs.name] = {
          access:subs.access,
          disabled:subs.disabled
        }
      }
      x.commands[command.name].subCommands = subArray;
    }
    x.commands[command.name] = {
      access:command.access,
      bounded:command.bounded,
      disabled:command.disabled,
    }
    getSubs();
  }
  console.log("Success!");
  x.save();
});

命令包含以下內容(我將在示例中使用兩個命令):

work:{
  access:"All",
  bounded:"A Channel",
  disabled:false
},
profile:{
  access:"All",
  bounded:"Another Channel",
  disabled:false,
  subCommands:{
    bio:{
      access:"All",
      disabled:true
    }
    register:{
      access:"All",
      disabled:false
   }
 }

快進到現在,我制作了一個應該編輯這些命令的配置文件。 我寫的代碼工作得很好; 但是,ZCCADCDEDB567ABAE643E15DCF0974E503Z 無法保存命令的任何更改。 除了與命令相關的任何內容外,我的 Schema 中的所有其他內容都可以在配置文件中使用。

我知道什么問題。 ZCCADDEDB567ABAE643E15DCF0974E503Z 在 Schema 中找不到命令,不知何故感到困惑。 而且我知道我可以通過將所有命令及其屬性添加到 Schema 來修復它。 唯一的問題是它很乏味,並且不是我添加任何新命令的干凈解決方案。 另外,我將命令的所有信息放在一個單獨的文件中,所以我不想重寫我已經寫的內容。

我的問題是:我的問題有解決方法嗎? 我嘗試將commands to Schema.Types.Mixed ,但這並沒有解決它。 我也到處尋找類似的東西,但找不到任何東西。

這是所要求的完整架構:

const {Schema, model} = require("mongoose");
const settings = require("../utils/settings");

const guildSchema = Schema({
  guildId:String,
  symbols:{
    prefix:{type:String, default:";"},
    currency:{type:String, default:"$"}
  },
  channels:{
    casinoChannels:Array,
    fineChannels:Array
  },
  commands:Schema.Types.Mixed,
  hierarchy:[{
    name:String,
    role:{type:String, default:""},
    members:Array
  }],
  users:[{
    userId:String,
    cash:Number,
    bank:Number,
    items:[{
      name:String, 
      amount:Number
    }],
    timers:{
      work:String,
      crime:String,
      hack:String,
      steal:String,
      daily:String,
      weekly:String,
      marry:String,
      divorce:String,
      idea:String,
      report:String,
      quiz:String
    },
    fine:{
      fineId:String,
      description:String,
      report:String,
      pay:Number
    },
    used:String
  }],
});

guildSchema.virtual("addUser").set(function(id){
  const user = {
    userId:id,
    cash:settings.cash,
    bank:settings.bank
  };

  this.users.push(user);
  return user;
});   

module.exports = model("Servers", guildSchema);

使用findOneAndUpdate更新集合中的現有文檔。

讓您要在 mongodb 的“命令”中更新的 object 位於x變量中。

Guild.findOneAndUpdate({guildId : serverId},{commands : x));

當找到匹配項時,您存儲在x變量中的 object 將直接更新/替換為該新數據。

更新不完全替換現有的 OBJECT

let guild = Guild.findOne({guildId : serverId});
if(guild){
// guild.commands here will have the existing object. 
// Modify it as required and then use findOneAndUpdate again
}

解決方案非常簡單。 我從這個網站上拿了它: https://mongoosejs.com/docs/2.7.x/docs/schematypes.html

給予信任:

由於它是無模式類型,您可以將值更改為您喜歡的任何其他值,但 ZCCADCDEDB567ABAE643E15DCF0974E503Z 失去了自動檢測/保存這些更改的能力。 要“告訴” Mongoose Mixed 類型的值已更改,請調用文檔的 .markModified(path) 方法,將路徑傳遞給剛剛更改的 Mixed 類型。

因此,每當我更新命令時(也就是每當我更改訪問、有界或禁用變量時),我都會在命令 function 上使用標記修改方法。 我的代碼是:

guildSchema.virtual("saveCommands").set(function(name){
  if(["access", "bounded", "disabled"].includes(name)) this.markModified('commands');
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM