Javascript 使用mongoose更新MongoDB中数组内的对象
我正在尝试更新文档中数组中的对象。这些对象不是子文档,因此没有唯一的ID。我尝试了各种方法来实现这一点,但似乎没有任何效果(例如,什么都没有发生-没有错误,但是文档没有更新) 仅显示代码可能更容易。首先,以下是此集合中的文档示例:Javascript 使用mongoose更新MongoDB中数组内的对象,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在尝试更新文档中数组中的对象。这些对象不是子文档,因此没有唯一的ID。我尝试了各种方法来实现这一点,但似乎没有任何效果(例如,什么都没有发生-没有错误,但是文档没有更新) 仅显示代码可能更容易。首先,以下是此集合中的文档示例: { _id: 123, //other fields go here submissions: [ { submission: 1, downloaded: null, //Thi
{
_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
}
]
}
现在我的猫鼬查询(在快速路线内):
我还尝试过在$set
命令中使用$
符号,即'submissions.$.assessorNotes':req.body.assessorComments'
,但这似乎也不起作用
我哪里出错了
干杯
Chris刚刚用上面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"
}
]
}
编辑:我的直觉是,错误也可能发生在Mongoose中的更新中,您可以尝试将两者都更改为位置运算符,以及使用if-if-fitness代替update
请尝试此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
}
});
刚才通过shell中的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
}
]
}
然后我运行了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"
}
]
}
编辑:我的直觉是,错误也可能发生在Mongoose中的更新中,您可以尝试将两者都更改为位置运算符,以及使用if-if-fitness代替update
请尝试此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
}
});
它应该与位置运算符
$
配合使用。您确定有匹配项吗?如果您只是使用这些参数find
,您找到文档了吗?尝试运行find
,它返回了正确的文档,因此看起来我正在获得匹配项-它只是没有更新。是否已尝试使用findOneAndUpdate
也是-同样的问题它应该与位置运算符$
一起工作。你确定你有匹配项吗?如果你只是用这些参数查找
,你找到文档了吗?尝试运行查找
,它返回了正确的文档,因此看起来好像我得到了匹配项-它只是没有更新。你尝试过吗hfindOneAndUpdate
也一样-同样的问题刚刚尝试了findOneAndUpdate
,似乎也有同样的问题。当我按照Tom的建议进行find
时,它会返回正确的文档,因此看起来好像我有匹配的文档。除了更新和findOneAndUpdate
之外,还有其他选择吗?可能是用在gsave
或类似的东西?您可以使用find/findOne在回调中返回您的对象,然后修改值并最终调用save函数。您是否也在$set中使用位置运算符?我为Mongoose添加了一个查询,请尝试一下,看看它是否有效?我注意到在集合c的末尾缺少一个大括号Omand.OK,我已经设法解决了它-我将很快添加解决方案,但基本上它涉及对文档执行findById
,然后在提交数组中循环,在submission
上查找匹配项,然后使用save
-与您的建议非常相似。update
不起作用首先-这是猫鼬的常见错误吗?当然,它可以用于迭代和保存,但也可以用于update
和findOneAndUpdate
和findByIdAndUpdate
。你确定你的req.body
参数没有问题吗?有没有错误?只是尝试了findOneAndUpdate
和似乎也有同样的问题。当我按照Tom的建议进行查找时,它会返回正确的文档,因此看起来好像我有匹配项。除了更新和findOneAndUpdate
之外,还有其他选择吗?也许可以使用保存或类似的方法?您可以使用find/findOne在ca中返回您的对象llback,然后修改值,最后调用save函数。您是否也在$set中使用位置运算符?我为Mongoose添加了一个查询,您能试试看它是否有效吗?我注意到set命令末尾缺少一个大括号。好的,我已设法解决了它-我将很快添加解决方案,但基本上它涉及g在文档上查找一个findById
,然后在提交数组中循环,在submission
上查找匹配项,然后使用save
——这与您的建议非常相似。非常奇怪的是update
一开始就不起作用——这是mongoose的常见错误吗?当然,它可以用于迭代和save,但它也应该与update
和findOneAndUpdate
和findbyiandupdate
一起使用。您确定您的req.body
参数正常吗?是否有任何错误?