Mongoose嵌套数组对象文档创建问题:无法向field2推入数据
解决Mongoose文档对象数组字段push无效的问题
首先先修正你Schema定义里的两处错误:
- 子Schema引用拼写错误:
field2: [field2Schmea]应该改成field2: [field2Schema] - collection名称需要是字符串类型:
{ collection: testSchema}改成{ collection: 'testSchema'}
修正后的Schema代码:
var field2Schema = new mongoose.Schema({ fField1: String, fField2: String, fField3: String }, { _id: false}); var schemaName = new mongoose.Schema({ field1: String, field2: [field2Schema] }, { collection: 'testSchema'}); // 必须基于Schema创建模型,才能生成可保存的文档实例 var MyModel = mongoose.model('MyModel', schemaName);
接下来看你代码里的核心问题:
- 错误地直接操作Schema对象,而不是实例化模型的文档。Schema只是结构定义,不能直接赋值保存,必须用
new MyModel()创建文档实例。 - 循环中重复复用同一个
arrayObject,每次修改它的属性再push,导致数组里都是同一个对象的引用,且这个对象没有关联到父文档的上下文,Mongoose无法追踪到变化。 - 子文档不需要单独用
new rulesModel.field2()实例化,直接构造符合子Schema结构的普通对象即可。
正确的实现方式
方式一:直接push符合结构的对象
var arrayContainingData = [{ fField1: "Test", fField2: "Test", fField3: "Test" }]; // 创建新的文档实例 var doc = new MyModel(); doc.field1 = '你的field1值'; // 遍历数据,直接push对象到field2数组 arrayContainingData.forEach(item => { doc.field2.push(item); }); // 保存文档 doc.save() .then(saved => console.log('保存成功:', saved)) .catch(err => console.error('保存失败:', err));
方式二:如果子文档需要使用Mongoose的子文档方法(比如钩子函数)
arrayContainingData.forEach(item => { // 通过父文档的子数组create方法创建子文档实例 const subDoc = doc.field2.create(item); doc.field2.push(subDoc); }); doc.save() .then(saved => console.log('保存成功:', saved)) .catch(err => console.error('保存失败:', err));
额外提示
如果是更新已存在的文档,也可以用Mongoose的$push或$addToSet操作符:
MyModel.updateOne( { _id: '文档ID' }, { $push: { field2: { fField1: "Test", fField2: "Test", fField3: "Test" } } } ) .then(result => console.log('更新成功:', result)) .catch(err => console.error('更新失败:', err));
内容的提问来源于stack exchange,提问作者Nida Akram
相关产品推荐
相关产品推荐

