繁体   English   中英

用猫鼬在MongoDB中更新数组中的对象

[英]Updating objects within array in MongoDB with 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
        }
    ]
}

现在我的猫鼬查询(在快速路由内):

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在外壳中使用位置运算符对此进行了测试。

> 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而不是进行更新。

请尝试以下查询猫鼬:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM