如何解决如何通过MongoDb Shell将字符串字段转换为对象数组中的ObjectId? updateMany
所以我的MongoDb文档看起来像这样:
{
"_id" : ObjectId("5f1842d238ec58056d94bbb3"),"itemsPurchased" : [
{
"_id" : "5e7365360665d10011756af2","created" : "2020-03-19T12:27:34.108Z","productLine" : "5ce8ec9df5cc72002fee0d4e","price" : 1.9,"tax" : 7,"ean" : "42272120","expirationDate" : "2020-06-17T12:27:34.103Z","kiosk" : "5c17a3d963ca649138ec522c","loadCell" : "1"
},{
"_id" : "5e7365360665d10011756af3","loadCell" : "1"
}
],"paymentMethod" : [],"type" : "purchase","total" : NumberDecimal("3.8"),"session" : ObjectId("5f1842bf1f2028e369d945f0"),"orgId" : ObjectId("5cddce9a51cbb2002d636741"),"created" : ISODate("2020-07-22T13:44:50.973Z"),"updated" : ISODate("2020-07-22T13:44:50.973Z"),"__v" : 0
}
问题在于,在itemsPurchased []中(由于逻辑错误),存在id类型的id。例如"_id" : "5e7365360665d10011756af2"
和"productLine" : "5ce8ec9df5cc72002fee0d4e"
。如何遍历在itemsPurchased []中具有对象的所有文档,该文档具有字符串而不是ObjectIds,并将其转换为ObjectId类型。我尝试将$ convert和$ toObjectId与$ map一起使用,但似乎无法正确处理。
db.transactions.aggregate([
{ "$match": { "itemsPurchased._id": {$type: "string"}}},{ "$set": "itemsPurchased1": {
"$map": {
"input": "$itemsPurchased","in": {
"$toObjectId": [
"$$this",{
"productLine": {
"$toObjectId": "$$this.productLine"
}
}
]
}
}
}
}
无法正确显示地图部分
解决方法
您已正确使用$toObjectId
,在$mergeObjects
中与$toObjectId
合并时,只需更改$$this
而不是$map
,
{
"$set": {
"itemsPurchased1": {
"$map": {
"input": "$itemsPurchased","in": {
"$mergeObjects": ["$$this",{ "productLine": { "$toObjectId": "$$this.productLine" } }]
}
}
}
}
}
updateMany
db.transactions.updateMany({},[
{
"$set": {
"itemsPurchased": {
"$map": {
"input": "$itemsPurchased",{ "productLine": { "$toObjectId": "$$this.productLine" } }]
}
}
}
}
}
])
,
db.getCollection('transactions').update(
{"itemsPurchased.kiosk":{$type: "string"}},[{
"$set": {
"itemsPurchased": {
"$map": {
"input": "$itemsPurchased","in": {
"$mergeObjects": [
"$$this",{
"kiosk": {
"$toObjectId": "$$this.kiosk"
}
}
]
}
}
}
}
}],{multi:true})
这是更新方式...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。