造成“合作者...... $ conditionalHandlers”中的“美元($)前缀字段'$ conditionalHandlers'对存储无效的原因。”

时间:2017-06-24 09:15:12

标签: javascript node.js express mongoose ecmascript-6

我正在编写一个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有同样的问题,但是通过使用字符串“解决”它 - 这与我的问题相反。

1 个答案:

答案 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 }