如何格式化此猫鼬 updateone 查询
Posted
技术标签:
【中文标题】如何格式化此猫鼬 updateone 查询【英文标题】:How can I format this mongoose updateone query 【发布时间】:2022-01-17 05:51:33 【问题描述】:更新:我使用这里有人推荐的 arrayFilters 调整了查询,查询成功返回,但是数据库中的值永远不会改变。
我正在尝试根据传递给数据库函数的值更新 mongodb 集合中的某些字段。
module.exports.update_sprint = async function
update_sprint(teamname, update_data, sprint, sprintStar)
for(var i in update_data)
console.log(update_data[i].stars)
console.log(update_data[i].name)
TeamM.findOneAndUpdate(teamName: teamname,
$set:
'sprints.$[a].stars.$[b].stars': update_data[i].stars,
'sprints.$[a].stars.$[b].points': update_data[i].points,
'sprints.$[a].sprintstars': sprintStar
, arrayFilters: ["a.sprintnum": sprint, "b.name":
update_data[i].name]
,
function(error, success)
if (error)
console.log(error)
else
console.log(success)
)
数据库格式: enter image description here
我得到:
1
member1@lewisu.edu
0
member2@lewisu.edu
_id: new ObjectId("61b90840654b60a745e7e102"),
teamName: 'testing',
members: [ 'member1@lewisu.edu', 'member2@lewisu.edu' ],
scrumMaster: 'member1@lewisu.edu',
totalMembers: 2,
sprints: [ sprintnum: 1, stars: [Array], sprintstar: 'None' ],
__v: 0
_id: new ObjectId("61b90840654b60a745e7e102"),
teamName: 'testing',
members: [ 'member1@lewisu.edu', 'member2@lewisu.edu' ],
scrumMaster: 'member1@lewisu.edu',
totalMembers: 2,
sprints: [ sprintnum: 1, stars: [Array], sprintstar: 'None' ],
__v: 0
查询成功返回,但数据库中的值未更新
【问题讨论】:
结果告诉你modifiedCount
= 0,表示没有匹配的条目需要修改
我看到了,但是条目在那里,我只是认为我没有正确设置搜索参数。
你能从请求中提供你的团队名称和 sprintum 的记录吗?
更新了输出
【参考方案1】:
在您的请求中,您想匹配 sprints = sprintum,您只需将其更改为:
Test.updateOne( teamName: "test123", "sprints.sprintnum": 1 , // Mistake was in this line
$set:
'sprints.$.stars': update_data,
'sprints.$.sprintstar': sprintStar
)
之前:
"teamName": "test123",
"members": [
"test@lewisu.edu",
"test@lewisu.edu"
],
"scrumMaster": "test@lewisu.edu",
"totalMembers": 2,
"sprints": [
"sprintum": 1,
"stars": [
"name": "test@lewisu.edu",
"stars": 0,
"points": 0
,
"name": "test2@lewisu.edu",
"stars": 0,
"points": 0
],
"sprintstar": "None"
]
之后:
根据您的评论,我添加了多个标识符的示例:
Test.updateOne( teamName: "test123" ,
$set:
'sprints.$[i].stars.$[j].stars': 5,
'sprints.$[i].sprintstar': "test@lewisu.edu"
, arrayFilters: [ "i.sprintum": 1 , "j.name": "test@lewisu.edu" ] )
这将在带有 sprintum 的数组中更新 stars 数组中名称为“test@lewisu.edu”的人的星星
有了这个,你基本上可以在文档中的所有数组中做任何你想做的事情
【讨论】:
我不确定 sprintnum 是如何拼写错误的,但是在修复之后,我仍然没有更新值。它仍在查找条目,但是我认为将其丢弃的是子条目的数字排序并且无法引用它,例如,星号:数组的条目以数字顺序 0、1 列出。此应用程序越多将被使用,星号下的条目就会越多。但话又说回来,我对猫鼬很陌生。 如果要控制多个嵌套数组,可以使用 arrayFilters,它们是 updateOne() 函数中的第三个参数。这里有一个链接:docs.mongodb.com/manual/reference/operator/update/… 您可以通过首先识别具有 sprintum = 1 的对象然后识别具有名称 = test@lewisu.edu 的对象并在那里调整点来访问您想要的对象 我编辑了答案,在底部为您添加了 arrayFilters 的示例 查询现在正在工作并返回成功,但是由于某种原因,数据库中的值没有改变。由于拼写错误,我更新了代码和数据库模式,并提供了新的输出。感谢您的帮助 所以请求返回了正确更新的文档但数据库没有保存更改?以上是关于如何格式化此猫鼬 updateone 查询的主要内容,如果未能解决你的问题,请参考以下文章
如何将日期格式从对象的猫鼬数组更改为 ejs 视图上的字符串?