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

时间:2016-10-26 15:02:26

标签: javascript node.js mongodb mongoose

我试图更新文档中数组中的对象。对象不是子文档,因此没有唯一的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
        }
    ]
}

现在我的mongoose查询(在快速路线内):

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'符号尝试了此操作,但这似乎也无效。

我哪里错了?!

干杯!

克里斯

1 个答案:

答案 0 :(得分: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
        }
    ]
}

然后我运行了更新命令:

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"
        }
    ]
}

编辑:我的预感是错误也可能与Mongoose中的更新有关,您可以尝试将两者都更改为位置运算符,如果它符合您的需要而不是更新,则可以使用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
    }
});