Javascript 如何正确更新mongoose/mongodb子文档
我有一个有任务、有项目的小组。我想为特定组的特定任务更新特定项目的详细信息。我有组ID、任务ID和项目ID,我试图按照答案进行调整,但没有出现错误,只得到受影响的数字Javascript 如何正确更新mongoose/mongodb子文档,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有一个有任务、有项目的小组。我想为特定组的特定任务更新特定项目的详细信息。我有组ID、任务ID和项目ID,我试图按照答案进行调整,但没有出现错误,只得到受影响的数字0。还是我的做法不对 var deferred = Q.defer(); var set = {}; for (var field in item) { set['ITEMS.$.'+field] = item[field]; } Group.update( {_id:ID, "TASKS._id":
0
。还是我的做法不对
var deferred = Q.defer();
var set = {};
for (var field in item) {
set['ITEMS.$.'+field] = item[field];
}
Group.update(
{_id:ID, "TASKS._id":taskId, "TASKS.$.ITEMS._id": task.ID},
{$set : set},
function(error, numAffected){
if (error) { deferred.reject(new Error(error)); }
deferred.resolve(numAffected);
});
这些问题不断出现。这不是
$
操作符的工作方式(请参阅),也不清楚您想要完成什么。在单个查询中不能有a.$
和b.$
。出现这些问题是因为您的数据模型过于依赖嵌入而不是关联。根据经验,如果您在嵌入式列表中有一个嵌入式列表(或嵌入式列表之间的关联),那么您就错了。整理你的数据结构。作为猜测,试着让任务成为一等公民。@mnemosyn首先,项目要求将其保存在单个集合中,在许多情况下,第二种可能不是将其保存在单个集合中的推荐方式,但在某些情况下,它有自己的用例。最后,我不想表现得很聪明,但我不相信我能更清楚地了解我要实现的目标。“我有一个团队,他们有任务,有项目。我想更新特定项目的详细信息”
如果你能告诉我什么不清楚,我很乐意添加更多细节,谢谢。我同意。虽然过度规范化是一件坏事,但可以使用一些方法。例如,一项任务需要记录在案。只有一个字段表示与此任务关联的组。甚至这种情况也可能改变。因此,将任务从团队a移动到团队B比简单地更改对指定团队的引用更能改变数据库中的内容。此外,一个团队可能有数百项任务,每项任务都与其他文档、信息等相关。对于一个组,您将很快达到16MB的文档限制。任务应该是一等公民的另一个指标。@jonnieM:我不清楚的是更新语义:wheretasks.\u id=a和tasks.$.ITEMS.\u id=b,set ITEMS.$.foo
-如何使用约束将找到的文档映射到项。$
?匹配将是任务。$
并且我可以更改任务。$.ITEMS.foo
等等,但是我不能使用匹配索引从一个列表转到另一个列表。$。“特定项目”对我个人来说是有意义的,但我看不出标准是如何识别项目的(除非这是问题中的一个错误,并且你真的想修改'TASKS.$.ITEMS.+field
)。@mnemosyn我理解你的意思。我显然不明白$
是如何工作的,谢谢你把它清理干净