是啥导致“'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' 对存储无效。”的主要内容,如果未能解决你的问题,请参考以下文章