在MongoDB中使用mongoose更新数组中的对象

Updating objects within array in MongoDB with mongoose

本文关键字:数组 更新 对象 MongoDB mongoose      更新时间:2023-09-26

我正在尝试更新文档中数组内的对象。这些对象不是子文档,因此没有唯一的ID。我试着看各种方法来做到这一点,但它只是似乎没有任何效果(如,什么都没有发生-没有错误,但文档不更新。

只显示代码可能更容易。首先,下面是这个集合中的一个文档示例:

{
    _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',但这似乎也不起作用。

我哪里出错了?!

干杯!

克里斯

刚刚用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
        }
    ]
}

然后我运行更新命令:

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,如果它适合你的需要,而不是更新。

请尝试查询Mongoose:

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
    }
});