在一个查询中,在Mongo对象中添加一个新字段,并使用另一个字段中的值进行初始化

时间:2019-06-18 07:12:02

标签: mongodb

我想使用一个mongo查询将新字段添加到我的一个集合中的所有mongo对象中。该新字段将被初始化为其对象中另一个字段的值。

说Mongo对象就像:

{
    "_id" : "24a1aefe-7242-4104-b6a9-8f9993b22019",
    "attributes" : {
        "product name" : "Duracell Aa Batteries 2 Pc"
    },
    "sku_id" : "4_5",
    "state" : "ENABLED"
}

我想制作所有mongo对象,例如:

{
    "_id" : "24a1aefe-7242-4104-b6a9-8f9993b22019",
    "attributes" : {
        "product name" : "Duracell Aa Batteries 2 Pc"
    },
    "sku_id" : "4_5",
    "new_sku_id": "4_5"
    "state" : "ENABLED"
}

我能够使用pymongo做到这一点,但这需要将多个更新查询触发到mongo服务器并在for循环中工作。

是否有单个mongo查询可以解决我的问题?请帮忙。

我正在使用以下不起作用的mongo查询:

  

db.skus.update({},{“ $ set”:{“ new_sku_id”:“ $ sku_id”}},{multi:true})

但这不起作用。它产生以下mongo对象:

{
    "_id" : "24a1aefe-7242-4104-b6a9-8f9993b22019",
    "attributes" : {
        "product name" : "Duracell Aa Batteries 2 Pc"
    },
    "sku_id" : "4_5",
    "new_sku_id": "$sku_id"
    "state" : "ENABLED"
}

请帮助

2 个答案:

答案 0 :(得分:1)

您不能在update语句中引用其他字段,但是可以使用$addFields生成该字段,并使用$out用聚合输出重写现有集合:

db.collection.aggregate([
    {
        $addFields: {
            new_sku_id: "$sku_id"
        }
    },
    {  $out: "collection" }
])

答案 1 :(得分:0)

在mongo集合中,您可以运行此命令。这将花费一些时间,具体取决于集合中文档的数量。

db.getCollection('skus').find({}).forEach(function(obj){
 db.getCollection('skus').update({_id:obj._id},{$set:{new_sku_id: obj.sku_id}})
})