Javascript 如何正确更新mongoose/mongodb子文档

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

我有一个有任务、有项目的小组。我想为特定组的特定任务更新特定项目的详细信息。我有组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":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:我不清楚的是更新语义:where
tasks.\u id=a和tasks.$.ITEMS.\u id=b,set ITEMS.$.foo
-如何使用约束将找到的文档映射到
项。$
?匹配将是
任务。$
并且我可以更改
任务。$.ITEMS.foo
等等,但是我不能使用匹配索引从一个列表转到另一个列表。$。“特定项目”对我个人来说是有意义的,但我看不出标准是如何识别项目的(除非这是问题中的一个错误,并且你真的想修改
'TASKS.$.ITEMS.+field
)。@mnemosyn我理解你的意思。我显然不明白
$
是如何工作的,谢谢你把它清理干净