我正在编写一个Node / Express / Mongoose(最新版本)应用程序,其中包含“Projects”列表,其中包含IDS为“Users”的“协作者”。到目前为止,我一直将外键列表存储为十六进制字符串。现在这使得执行一些稍微复杂的聚合变得困难,所以我决定将它们存储为ObjectId类型,这使得连接更简单。
在创建数组的函数中,push(userId)版本工作正常,将协作者添加到数组中。但是,将ObjectId推送到数组中,或者分配包含ObjectId的数组会失败并显示
“美元($)前缀字段'$ conditionalHandlers'in 'collaborators .. $ conditionalHandlers'对存储无效。“
<a data-toggle="modal" href="linktoyourmodaltemplate" data-target="#modal">Click me</a>
项目模型:
function addCollaborator(projectId, userId, fn){
projectModel.findById(projectId, (err, project)=>{
if(err) return fn(err);
project.collaborators.push( new Schema.Types.ObjectId(userId)); // errors
// project.collaborators = [ new Schema.Types.ObjectId(userId) ]; // errors
// project.collaborators.push( userId); // works
project.save((err)=>{
logService.error('Error adding collaborator to project: '+err.toString());
});
fn(null);
});
}
使用文本ID,我得到的项目如下:
const ProjectSchema = new mongoose.Schema({
name: String,
create_date: Date,
administrators: Array, // list of user._id
collaborators: Array, // list of user._id ObjectIds
});
当它中断时,我记录错误,并留下一个空数组:
{ "_id" : ObjectId("594e2222a26ca3505c18c674"),
"name" : "Pips 2nd Project", "create_date" : ISODate("2017-06-24T08:26:10.498Z"),
"collaborators" : [ "5936a3576d6c5a3ef4ee0936" ],
"administrators" : [ "594dbba8186f1a2f5ad7539c" ], "__v" : 1 }
我想要实现的目标是:
{ "_id" : ObjectId("594e278b6a68a2815b043bd1"),
"name" : "Pips third Project", "create_date" : ISODate("2017-06-24T08:49:15.091Z"),
"collaborators" : [ ],
"administrators" : [ "594dbba8186f1a2f5ad7539c" ], "__v" : 0 }
我已经看过其他一些SO或github问题,但似乎没有人解释这个问题。 This one有同样的问题,但是通过使用字符串“解决”它 - 这与我的问题相反。
答案 0 :(得分:0)
在阅读了其他一些帖子(e.g.)之后,我意识到我使用了错误的方法从十六进制字符串创建一个ObjectId。
new Schema.Types.ObjectId(userId) // not right!
应该是:
mongoose.Types.ObjectId(userId)
所以现在按预期工作:
project.collaborators.push( mongoose.Types.ObjectId(userId));
并产生:
{ "_id" : ObjectId("594e278b6a68a2815b043bd1"),
"name" : "Pips third Project", "create_date" : ISODate("2017-06-24T08:49:15.091Z"),
"collaborators" : [ ObjectId("5936a3576d6c5a3ef4ee0936") ],
"administrators" : [ "594dbba8186f1a2f5ad7539c" ], "__v" : 1 }