不能用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议:
- 创build一个简单的模式,并尝试存储对象,这样,如果必须对模式执行操作,就可以知道该模式。
- 您可以在示例应用程序中试用您的模式,以查找是否有某个依赖项导致了问题。
一旦你知道问题出在哪里,你也可以找出解决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 })
?