在MongoDB中使用mongoose更新数组中的对象
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在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
}
});
相关文章:
- 如何通过数组更新角度子范围
- 如何创建独立于数组更新的组件列表
- 使用数组更新完整日历
- 数组更新后的敲除绑定
- c3js - 使用 chart.load() 使用颜色数组更新图表颜色
- 猫鼬位置数组更新
- 如何使用新数组更新 dom-repeat 列表
- .click在Javascript中没有任何效果 - 应该基于数组更新两个元素
- Angular2 从后端服务中的数组更新视图
- 推送前的数组更新 - javascript
- 使用 ajax 使用 jquery 数组更新 mysql 数据库
- Javascript二维字符串数组更新值
- 如何将数组更新到firebase
- Meteor AutoForm:如何用子文档数组更新模式值
- 为什么当数组更新时,引用数组元素的n't是我的对象
- 从类型化数组更新svg路径
- 聚合物dom-repeat如何通知数组更新
- 什么时候改变子数组更新子数组vs.创建一个新的子数组?[JavaScript]
- 当Javascript中的数组更新时,如何使用PHP更新和插入数据库
- 使用修改后的数组更新对象属性值