mongoose array push并没有保存我的条目,也没有违背我使用push的简单愿望

mongoose array push并没有保存我的条目,也没有违背我使用push的简单愿望,mongoose,Mongoose,我有两种模式: var optionsSchema = new Schema({ locationname: String, locationnumber : String }); var Xoption = mongoose.model('Xoption', optionsSchema); var estoreSchema = new Schema({ user: String, odds: String, //options: [

我有两种模式:

    var optionsSchema = new Schema({
    locationname: String,
    locationnumber : String     
});

var Xoption = mongoose.model('Xoption', optionsSchema);

var estoreSchema = new Schema({
    user: String,
    odds: String,
    //options: [optionsSchema]
    options: [{ type: Schema.Types.ObjectId, ref: 'Xoption' }]
});

var Estore = mongoose.model('Estore', estoreSchema);


export default Estore;
export {  Xoption };
注意,这些选项有[{type:Schema.Types.ObjectId,ref:'Xoption'}],因此它将存储xoptions集合中对象的ID

以下是一个Estore文档的示例:

  {
        "_id" : ObjectId("5f998198df1e7b7598ba307c"),
        "options" : [
                ObjectId("5f998198df1e7b7598ba307b")
        ],
        "user" : "two",
        "odds" : "two",
        "__v" : 0
}
如您所见,选项数组包含Xoptions集合的ID。 现在,当我尝试将另一个id推送到选项数组时,我会执行以下操作: 我从Xoption模型中获取id。为了简化这里的代码并放大问题的相关部分,我只需将其分配给一个变量:

 let getid = 'ObjectId("5f997d78ace0547ba8c05646")';   
现在,我需要将该id推送到我的Estore中的选项数组中,因此我执行以下操作:

Estore.findOne({ "odds": "two" }).then(doc => {
    console.log("xxx", doc.options);
    doc.options.push(getid);

}).catch(err => {
    console.log("error message :", err);
});
当我这样做时,我会得到一个错误:错误转换到ObjectId,错误原因是:

    reason:
   Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
现在我有了进展,所以我从变量中取出了ObjectId,我没有得到任何错误,但是id没有被推送到options数组中:

let getid = '5f997d78ace0547ba8c05646';
这只是一个练习代码。复制它,改变它,给我另一个例子。请帮助我理解为什么对阵列执行简单的推送操作不起作用


我的问题:如何将该变量的值推送到选项数组?

问题是在更新模型后保存模型。 因此,与此相反:

Estore.findOne({ "odds": "two" }).then(doc => {
console.log("xxx", doc.options);
doc.options.push(getid);

}).catch(err => {
    console.log("error message :", err);
});
只需在push()之后添加save即可:

完整代码应为:

 Estore.findOne({ "odds": "two" }).then(doc => {
    console.log("xxx", doc.options);
   doc.options.push(getid);
    doc.save();
}).catch(err => {
   console.log("error message :", err);
});
另外,选项:[{type:Schema.Types.ObjectId,ref:'Xoption'}]接受带有24位字符的ObjectId,您之前不需要ObjectId,它应该是这样的:

let getid = '5f997d78ace0547ba8c05646';

getid
的格式真的有效吗?如果您使用有效的ObjectId对
getid
进行硬编码,会怎么样?也许它不在这个地方?有点难说,在任何地方看起来都不错。是的,它是有效的。硬编码getid不会改变问题。
let getid = '5f997d78ace0547ba8c05646';