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" 

【讨论】:

感谢您的留言 :) 你能告诉我falsetrue 代表什么吗?它代表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 - 数组元素作为变量的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 查询求助,嵌套数组里面查东西

mongodb用变量更新数组

在MongoDB中获取数组的第n个元素

在MongoDB中获取数组的第n个元素

如何在mongodb的数组对象的嵌套数组中添加元素

MongoDB,按两个数组之间匹配元素的数量对结果进行排序