MongoDB - 数组元素作为变量
Posted
技术标签:
【中文标题】MongoDB - 数组元素作为变量【英文标题】:MongoDB - Array element as variable 【发布时间】:2018-03-08 16:52:14 【问题描述】:假设这里是同一个文档:
"_id" : 1.0,
"custname" : "metlife",
"address" :
"city" : "Bangalore",
"country" : "INDIA"
如果我想向该文档推送一个额外的字段,如下所示:
db.customers.updateMany(
"address.country":"INDIA",
$push : city: "$address.country"
)
导致错误更新:
"_id" : 1.0,
"custname" : "metlife",
"address" :
"city" : "Bangalore",
"country" : "INDIA"
,
"city" : "$address.city"
而不是这个:
"_id" : 1.0,
"custname" : "metlife",
"address" :
"city" : "Bangalore",
"country" : "INDIA"
,
"city" : "Bangalore"
如何达到上述效果?
【问题讨论】:
【参考方案1】:您目前无法在更新中引用其他字段值(更多here)。聚合框架中有一个解决方法(使用$out),但它会替换整个集合。
我认为您可以考虑在您的情况下使用$rename。它不会添加新字段,但可以将 city
移动到文档的顶层。
db.customers.updateMany("address.country":"INDIA", $rename: "address.city": "city")
将为您提供以下结构:
"_id" : 1, "custname" : "metlife", "address" : "country" : "INDIA" , "city" : "Bangalore"
【讨论】:
感谢您的留言 :) 你能告诉我false
和true
代表什么吗?它代表upsert/multi
吗?
@RahulRaj 抱歉,我在更新操作中测试了这个案例,updateMany
不需要它们【参考方案2】:
就像@mickl 说的:您目前不能在更新中引用其他字段值, 你必须遍历你的集合来更新文档,试试这个:
db.eval(function()
db.collection.find("address.country":"INDIA").forEach(function(e)
e.city= e.address.city;
db.collection.save(e);
);
);
请记住,这将阻止数据库,直到所有更新完成。
【讨论】:
你的意思是说数据库将被锁定直到执行完成?【参考方案3】:试试这个
db.customers.updateMany(
"address.country":"INDIA",
$push : city: "address.country"
)
去掉$符号
【讨论】:
以上是关于MongoDB - 数组元素作为变量的主要内容,如果未能解决你的问题,请参考以下文章