不能用mongoose在mongo中保存一些对象

我试图使用mongoose在文档中坚持一个对象的数组。 我已经尝试了多次,但它不是坚持在文件中的数组。 它在文档中放置一个空数组。

以下是我的模式:

var ProfileSchema = new Schema({ name: String, PagesData: [{ pageAccessToken: {type: String, get: decryptText, set: encryptText}, category: String, name: String, id: String, perms: [String] }] }); module.exports = mongoose.model('Profile', ProfileSchema); 

我正在尝试使用以下查询来保存具有对象数组的文档:

 var newProfile = new Profile(); newProfile.name = "someName"; newProfile.PagesData = [ { pageAccessToken: 'someToken', category: 'Bags/Luggage', name: 'someBrandName', id: '12345', perms: [ 'ADMINISTER', 'EDIT_PROFILE', 'CREATE_CONTENT' ] } ]; newProfile.save(function(err, result, numAffected){ if(err) { console.log(err); res.send(500, "Error"); } console.log(result); res.send(200, "Success"); }); 

我尝试使用debuggingmongo命令

require('mongoose')。set('debug',true)

在debugging日志上显示,插入命令执行期间为空数组。

任何人都可以告诉我如何存储这个对象数组在我的模式?

谢谢,

更新:

时间太长,我仍然无法找出问题的根源。 有一个很长的线程在github上。 https://github.com/Automattic/mongoose/issues/3249我想请其他专家请看看,并build议我一些方法,我可以解决这个问题。 我真的被困在这。

更新2:

到目前为止,这个解决scheme对我来说没有任何帮助,所以我决定只修改模式来满足我的要求。 这导致了一个不同的问题:

我想用一个objectId作为键和一个string值数组作为它的值来创build一个映射。 我能得到的最接近的是:

 var schema = new Schema({ map: [{myId: {type:mongoose.Schema.Types.ObjectId, ref: 'MyOtherCollection'}, values: [String]}] }); 

但不知何故,这不适合我。 当我使用{upsert:true}执行更新时,它无法正确填充地图中的key:值。 事实上,我甚至不确定是否已经正确地声明了模式。

任何人都可以告诉我,如果模式是正确的? 另外,如何使用{upsert:true}对此模式执行更新?

另外,如果上述不正确,那么我怎么能通过其他方式来模拟我的需求。 我的用例是我想保留一个给定的objectId值的列表。 我不想用同一个键重复input,这就是为什么select地图。

请build议,如果方法是正确的,或者这应该build模一些其他方式?

谢谢

我尝试了你在这里提供的确切的代码,它为我工作。 我不确定是什么原因导致你的问题。 除非我们得到同样的问题,否则很难纠正这个问题。 这里有几个你可能会尝试的build议:

  1. 创build一个简单的模式,并尝试存储对象,这样,如果必须对模式执行操作,就可以知道该模式。
  2. 您可以在示例应用程序中试用您的模式,以查找是否有某个依赖项导致了问题。

一旦你知道问题出在哪里,你也可以找出解决scheme。 我希望它有帮助。

我testing了这个和插入为我使用下面:(我必须删除get:decryptText,设置:encryptText)

 var n = { name: "Testing for mongoose", PagesData : [{ pageAccessToken: 'someToken', category: 'Bags/Luggage', name: 'someBrandName', id: '12345', perms: [ 'ADMINISTER', 'EDIT_PROFILE', 'CREATE_CONTENT' ] } ] } Profile.create(n, function (err) { if (!err) { return 'records saved successfully'; } else { return error on save:' + err; } }); 

数据库结果屏幕截图:

要创build多个pageDatas,您可以将其用作embedded式集合,而不是使用数组。

scheme如下:

 var PagesDataSchema = new Scheme({ pageAccessToken: {type: String, get: decryptText, set: encryptText}, category: String, name: String, id: String, perms: [String] }) var ProfileSchema = new Schema({ name: String, PagesData: [PagesDataSchema] }); module.exports = mongoose.model('Profile', ProfileSchema); 

参考 : http : //mongoosejs.com/docs/subdocs.html

保存文件,你可以使用像。

 exports.save = function(req,res){ var test = new ProfileSchema; // new object for ProfileSchema domain. test.name= req.body.name; if(req.body.PagesData){ req.body.PagesData.forEach(function(page){ // For every element of pageData from client. test.PagesData.push(page) // This pushes each and every pagedata given from the client into PagesData. }) } test.save(function (saveErr, saved) { // Saves the new document into db. if (saveErr) { console.log(saveErr) return; } res.status(HttpStatus.OK).json(saved); }); }; 

希望这可以帮助。

你有没有尝试过

 Profile.create({ name: "someName", PagesData: [ { pageAccessToken: 'someToken', category: 'Bags/Luggage', name: 'someBrandName', id: '12345', perms: [ 'ADMINISTER', 'EDIT_PROFILE', 'CREATE_CONTENT' ] } ] }, function(err, profile) { // do your stuff })