【发布时间】:2015-11-02 11:40:35
【问题描述】:
我正在尝试使用 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");
});
我尝试使用
调试 mongo 命令require('mongoose').set('debug', true)
在调试日志中显示,插入命令执行期间为空数组。
谁能告诉我如何将这个对象数组存储在我的架构中?
谢谢,
更新:
时间太长了,我仍然无法找出问题的根本原因。 github上有一个很长的线程。 https://github.com/Automattic/mongoose/issues/3249 我希望其他专家看看并建议我一些可以解决问题的方法。我真的被困在这个问题上。
更新 2:
到目前为止,没有一个解决方案适合我,所以我决定只修改架构以满足我的要求。这导致了另一个问题:
我想创建一个以 objectId 作为键并以字符串值数组作为其值的映射。我能得到的最接近的是:
var schema = new Schema({
map: [{myId: {type:mongoose.Schema.Types.ObjectId, ref: 'MyOtherCollection'}, values: [String]}]
});
但不知何故,这对我不起作用。当我使用 {upsert: true} 执行更新时,它没有正确填充地图中的键:值。事实上,我什至不确定我是否正确地声明了架构。
谁能告诉我架构是否正确?另外,如何使用 {upsert: true} 对此架构执行更新?
另外,如果上述不正确并且无法实现,那么我该如何通过其他方式来模拟我的要求。我的用例是我想保留给定 objectId 的值列表。我不希望任何具有相同键的重复条目,这就是选择地图的原因。
请建议该方法是否正确或是否应该以其他方式建模?
谢谢
【问题讨论】:
-
您可能想让更新 2 成为一个不同的问题,因为它完全不同。
-
通过 {upsert:true} 更新,您的意思是在地图中插入一个元素,如果 myId 已经存在则替换它?您是否考虑过为它创建一个单独的集合,而不是将它们嵌入到地图中?
-
@phillee:我为更新 2 创建了一个单独的帖子stackoverflow.com/questions/32038606/…
-
@phillee:是的,如果给定的 myId 已经有一个条目,另一个插入应该更新前一个。我认为创建一个单独的集合不是基于数据库设计的正确方法,我认为给定的 objectId 和相应的值应该有一些映射作为字符串数组
标签: node.js mongodb express mongoose