[英]Mongoose saving array of array instead of a single array
我正在尝试使用mongoose将数组保存在MongoDB上。 这是我的模型:
let itemFields = { "name": { "type": "String", "required": true, "unique": true } };
let modelFields = {
"name": { "type": "String", "required": true, "unique": true },
"description": { "type": "String" },
"options": { "type": "Array", "ref": "SelectOptionItem" },
"company_id": { "type": "ObjectId", "ref": "Company", "required": true },
"deleted": { "type": "Boolean", "required": true },
"createdAt": { "type": "Number" },
"updatedAt": { "type": "Number" }
};
const SelectOptionItem = new mongoose.Schema(itemFields);
const schema = new mongoose.Schema(modelFields);
后来我有以下代码来保存数据:
schema.statics.create = async function(context, data) {
console.log("Saved data:");
console.log(data);
let so = new this(data);
so.save();
}
我在哪里得到以下日志:
Saved data:
{ name: 'aa',
description: 'aa',
options: [ { name: '1' }, { name: '2' } ],
company_id: '59b2cd9a072e4f28b839aaa0',
deleted: false,
createdAt: 1511569192524 }
最后,这是我在mongo控制台中得到的:
> db.selectoptions.find({});
{ "_id" : ObjectId("5a18b7288c688033a4adcb0c"), "name" : "aa", "description" : "aa", "company_id" : ObjectId("59b2cd9a072e4f28b839aaa0"), "deleted" : false, "createdAt" : 1511569192524, "options" : [ [ { "name" : "1" } ], [ { "name" : "2" } ] ], "__v" : 0 }
修复该options
是一个数组数组[[]]
。 稍后在检索该数据时,我遇到了一个问题,因为我期望使用单个数组。
我需要不明白为什么猫鼬会在options
字段中保存一个数组数组以及如何解决这个问题。
更改此行:
"options": { "type": "Array", "ref": "SelectOptionItem" },
这样:
"options": { "type": "Mixed", "ref": "SelectOptionItem" },
或以此:
"options": [SelectOptionItemSchema],
第二个生成项目的_id
有两种方法可以实现此目的。
SelectOptionItem
创建单独的集合 SelectOptionItem
集合并使用ref
使用猫鼬4.13.1
。 您可以尝试将对象插入到数组中,而无需为SelectOptionItem
创建新的集合。 如果不需要,可以始终对options
文档禁用_id
属性。
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
var SelectOptionItemSchema= mongoose.Schema({ "name": { "type": "String", "required": true, "unique": true } })
let modelFields = {
"name": { "type": "String", "required": true, "unique": true },
"description": { "type": "String" },
"options": [SelectOptionItemSchema],
"company_id": { "type": "ObjectId", "ref": "Company", "required": true },
"deleted": { "type": "Boolean", "required": true },
"createdAt": { "type": "Number" },
"updatedAt": { "type": "Number" }
};
var SelectOptionSchema = mongoose.Schema(modelFields)
var SelectOption = mongoose.model('SelectOption', SelectOptionSchema);
var data = { name: 'aa', description: 'aa', options: [ { name: '1' }, { name: '2' } ], company_id: '59b2cd9a072e4f28b839aaa0', deleted: false, createdAt: 1511569192524 }
var newSelectOption = new SelectOption(data)
如果您想不惜一切代价为SelectOptionItem
创建一个集合,那么在创建文档时,您需要在数组中发送SelectOptionItem Ids
以获取选项。 因为ref
与外键相似。
您可以在查询时使用.populate
获取完整的对象。 有关更多查询技术,请参考http://mongoosejs.com/docs/populate.html 。
注意:我不确定这有多准确,但是您很可能希望将ObjectId
发送到ref
列。
注意:ObjectId,Number,String和Buffer可用作参考。 但是,除非您是高级用户并且有充分的理由这样做,否则应该使用ObjectId。
var SelectOptionItemSchema = mongoose.Schema({ "name": { "type": "String", "required": true, "unique": true } })
var SelectOptionItem = mongoose.model('SelectOptionItem', SelectOptionItemSchema);
var firstOptionItem = new SelectOptionItem({name: "1"}); //5a18cfe79a61fd183530d467
var secondOptionItem = new SelectOptionItem({name: "2"}); //5a18d0089a61fd183530d469
let modelFields = {
"name": { "type": "String", "required": true, "unique": true },
"description": { "type": "String" },
"options": [{type: "ObjectId", ref: "SelectOptionItem"}],
"company_id": { "type": "ObjectId", "ref": "Company", "required": true },
"deleted": { "type": "Boolean", "required": true },
"createdAt": { "type": "Number" },
"updatedAt": { "type": "Number" }
};
var SelectOptionSchema = mongoose.Schema(modelFields)
var SelectOption = mongoose.model('SelectOption', SelectOptionSchema);
var data = { name: 'aa', description: 'aa', options: [ "5a18cfe79a61fd183530d467", "5a18d0089a61fd183530d469" ], company_id: '59b2cd9a072e4f28b839aaa0', deleted: false, createdAt: 1511569192524 }
var newSelectOption = new SelectOption(data)
SelectOption.find({}, function(err, response) {
console.log(response)
}).populate('options')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.