Mongodb 更新集合中双嵌套数组中的对象
具有此模式:Mongodb 更新集合中双嵌套数组中的对象,mongodb,meteor,simple-schema,Mongodb,Meteor,Simple Schema,具有此模式: Task = new SimpleSchema({ _id: { type: String, regEx: SimpleSchema.RegEx.Id, autoValue: function(){ return Random.id(); } }, title: { type: String, label: "Task title", } });
Task = new SimpleSchema({
_id: {
type: String,
regEx: SimpleSchema.RegEx.Id,
autoValue: function(){ return Random.id(); }
},
title: {
type: String,
label: "Task title",
}
});
Card = new SimpleSchema({
_id: {
type: String,
regEx: SimpleSchema.RegEx.Id,
autoValue: function(){ return Random.id(); }
},
tasks: {
type: [Task],
label: "Card tasks",
optional: true
}
});
ProjectSchema = new SimpleSchema({
name: {
type: String,
label: "Project name"
},
cards: {
type: [Card],
label: "Project cards",
optional: true
}
});
我正在尝试使用此函数更新它,通过编辑任务传递3个ID和一个对象:
editTask : function(projectId,cardId,taskId,oTask) {
if (! Meteor.userId()) {
throw new Meteor.Error("not-authorized");
}
check(projectId, String);
check(cardId, String);
check(taskId, String);
check(oTask, Object);
Projects.update({
_id: projectId,
cards: {
$elemMatch : {
_id: cardId,
tasks : {
_id : taskId
}
}
}
},
{
$set: {"tasks.$.Task": oTask}
});
}
错误说明:当修饰符选项为true时,验证对象必须至少有一个运算符。
据我所知,这个错误意味着$set:{“tasks.$.Task”:oTask}它没有正确指向
我也尝试过:$set:{“cards.tasks.$.Task”:oTask},$set:{“cards.tasks:$.tasks”:oTask}这不是一个经过测试的理论,但您的模式可能没有正确定义。在定义
Task
之前,您在Card
模式中使用Task
,在定义Card
之前,在ProjectSchema
中使用Card
。SimpleSchema在解析查询时可能会忽略某些属性,因为路径实际上并不存在。哦,很抱歉,它在我的代码中的顺序是正确的,为了可读性,我只是按顺序粘贴了它,我会修复它。您只能返回“外部”数组的匹配索引,因此,寻找匹配“内部”数组的位置是不可能的。在操作员的指导下,记录良好。理想情况下,不要“嵌套”数组,最多将结构展平为单个数组条目。谢谢,我在文档中读到了这一点,但没有发现这意味着我根本无法搜索更深的数组。我会试着把任务放在第一层。这不是一个经过测试的理论,但是你的模式可能没有正确定义。在定义Task
之前,您在Card
模式中使用Task
,在定义Card
之前,在ProjectSchema
中使用Card
。SimpleSchema在解析查询时可能会忽略某些属性,因为路径实际上并不存在。哦,很抱歉,它在我的代码中的顺序是正确的,为了可读性,我只是按顺序粘贴了它,我会修复它。您只能返回“外部”数组的匹配索引,因此,寻找匹配“内部”数组的位置是不可能的。在操作员的指导下,记录良好。理想情况下,不要“嵌套”数组,最多将结构展平为单个数组条目。谢谢,我在文档中读到了这一点,但没有发现这意味着我根本无法搜索更深的数组。我将尝试将任务放在第一级。