2016-10-26 43 views
0

我试图更新文档中的数组内的对象。对象不是子文档,因此没有唯一的ID。我尝试过看各种方法来做到这一点,但它似乎没有任何效果(如在,什么也没有发生 - 没有错误,但文件不更新)使用猫鼬更新MongoDB数组中的对象

可能更容易显示。代码首先,这里在此集合中文档的例子:

{ 
    _id: 123, 
    //other fields go here 
    submissions: [ 
     { 
      submission: 1, 
      downloaded: null, //This should be an ISODate when populated 
      assessor: null, //This should be an ObjectID when populated 
      feedbackUploaded: null, //This should also be an ISODate 
      path: '401Test1.doc', 
      assessorNotes: null //This should be a string when populated 
     }, 
     { 
      submission: 2, 
      downloaded: null, 
      assessor: null, 
      feedbackUploaded: null, 
      path: '401Test2.doc', 
      assessorNotes: null 
     } 
    ] 
} 

现在我的猫鼬查询(特快航线内):

const unit = req.body.unit; //e.g. 123 
const submission = req.body.submission // e.g. 2 
const date = Date.now(); 

Unit.update({ "_id": unit, "submissions.submission": submission }, { 
     $set: { 
      'submissions.assessorNotes': req.body.assessorComments, 
      'submissions.feedbackUploaded': date, 
      'submissions.assessor': req.body.assessor 
     }, function(err){ 
      //callback 
     } 
    }) 

我也试着在此使用$符号$set命令即'submissions.$.assessorNotes': req.body.assessorComments',但这似乎并不奏效。

我哪里错了?

干杯!

Chris

+0

它应该的位置操作'$'工作。你确定你有一场比赛吗?如果你只是用这些参数“发现”,你会找到这个文件吗? – TomG

+0

尝试运行一个'find'并且它返回了正确的文档,所以看起来好像我得到了一个匹配 - 它只是没有更新。已经尝试过'findOneAndUpdate' - 同样的问题 – Chris

回答

2

刚刚用TomG在shell中提到的位置运算符进行了测试。

> db.foo.find().pretty() 
{ 
    "_id" : 123, 
    "submissions" : [ 
     { 
      "submission" : 1, 
      "downloaded" : null, 
      "assessor" : null, 
      "feedbackUploaded" : null, 
      "path" : "401Test1.doc", 
      "assessorNotes" : null 
     }, 
     { 
      "submission" : 2, 
      "downloaded" : null, 
      "assessor" : null, 
      "feedbackUploaded" : null, 
      "path" : "401Test2.doc", 
      "assessorNotes" : null 
     } 
    ] 
} 

然后我跑了update命令:

db.foo.update(
    { _id: 123, "submissions.submission": 2 }, 
    { $set: { 
    "submissions.$.assessorNotes": "testAssessorNotes", 
    "submissions.$.feedbackUploaded": new Date(), 
    "submissions.$.assessor": "testAssessor" 
    } } 
) 

结果如下:

{ 
    "_id" : 123, 
    "submissions" : [ 
     { 
      "submission" : 1, 
      "downloaded" : null, 
      "assessor" : null, 
      "feedbackUploaded" : null, 
      "path" : "401Test1.doc", 
      "assessorNotes" : null 
     }, 
     { 
      "submission" : 2, 
      "downloaded" : null, 
      "assessor" : "testAssessor", 
      "feedbackUploaded" : ISODate("2016-10-26T15:33:09.573Z"), 
      "path" : "401Test2.doc", 
      "assessorNotes" : "testAssessorNotes" 
     } 
    ] 
} 

编辑:我的直觉是,错误也可能是与猫鼬的更新,您可以尝试将两者都更改为位置操作员,如果它符合您的需要而不是更新,则可以使用findOneAndUpdate

请尝试此查询的猫鼬:

Unit.update(
    { "_id": unit, "submissions.submission": submission }, 
    { $set: { 
     'submissions.$.assessorNotes': req.body.assessorComments, 
     'submissions.$.feedbackUploaded': date, 
     'submissions.$.assessor': req.body.assessor 
    } }, function(err, result) { 
     //callback 
    } 
}); 
+0

刚刚尝试过'findOneAndUpdate'并且似乎有同样的问题。当我按照Tom的建议做一个'find'时,它会返回正确的文档,看起来好像我有一场比赛。是否有另一种替代'更新'和'findOneAndUpdate'?也许使用'save'或类似的东西? – Chris

+0

您可以使用find/findOne在回调中返回对象,然后修改该值并最终调用保存功能。你是否也在$ set中使用位置运算符? – dyouberg

+0

我为Mongoose添加了一个查询,你可以试试看看它是否有效?我注意到您的设置命令结束时丢失了大括号。 – dyouberg