繁体   English   中英

猫鼬保存数组而不是单个数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM