是啥导致“'collaborators..$conditionalHandlers' 中的美元 ($) 前缀字段 '$conditionalHandlers' 对存储无效。”

Posted

技术标签:

【中文标题】是啥导致“\'collaborators..$conditionalHandlers\' 中的美元 ($) 前缀字段 \'$conditionalHandlers\' 对存储无效。”【英文标题】:What is causing "The dollar ($) prefixed field '$conditionalHandlers' in 'collaborators..$conditionalHandlers' is not valid for storage."是什么导致“'collaborators..$conditionalHandlers' 中的美元 ($) 前缀字段 '$conditionalHandlers' 对存储无效。” 【发布时间】:2017-11-27 19:46:20 【问题描述】:

我正在编写一个 Node/Express/Mongoose(最新版本)应用程序,该应用程序具有“项目”和“合作者”列表,即“用户”的 IDS。到目前为止,我一直将外键列表存储为十六进制字符串。这使得执行一些稍微复杂的聚合变得困难,因此我决定将它们存储为 ObjectId 类型,这使得连接更简单。

在创建数组的函数中,push(userId) 版本工作正常,将协作者添加到数组中。但是,将 ObjectId 推入数组,或分配包含 ObjectId 的数组失败,并出现

"美元 ($) 前缀字段 '$conditionalHandlers' 在 'collaborators..$conditionalHandlers' 对存储无效。”

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);
    );

项目模型:

const ProjectSchema = new mongoose.Schema(
        name: String,
        create_date: Date,
        administrators: Array,          // list of user._id
        collaborators: Array,           // list of user._id ObjectIds
    );

使用文本 ID,我得到的项目如下所示:

 "_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 

我想要实现的是:

 "_id" : ObjectId("594e2222a26ca3505c18c674"), 
"name" : "Pips 2nd Project", "create_date" : ISODate("2017-06-24T08:26:10.498Z"), 
"collaborators" : [ Object("5936a3576d6c5a3ef4ee0936") ], 
"administrators" : [ "594dbba8186f1a2f5ad7539c" ], "__v" : 1 

我见过其他一些 SO 或 github 问题,但似乎没有一个可以解释问题。 This one 有同样的问题,但通过使用字符串“解决”了它 - 这与我的问题相反。

【问题讨论】:

【参考方案1】:

在阅读了其他一些帖子 (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 

【讨论】:

以上是关于是啥导致“'collaborators..$conditionalHandlers' 中的美元 ($) 前缀字段 '$conditionalHandlers' 对存储无效。”的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致了这个推进错误?

是啥导致了 NSInvalidArgumentException?

是啥导致移动构造函数被删除

是啥导致系统发出蜂鸣声?

是啥导致 opensuse Docker 膨胀?

是啥导致连接中止?