如何在mongodb中的单个文档中更新嵌套对象(即具有对象类型的doc字段)

时间:2016-02-10 15:00:46

标签: mongodb

我有doc集合,其对象类型字段名为price(即见下文),我只想通过向其添加新的键值对来更新/插入该字段。

假设我将此作为集合(在db中):

[
 {
   _id: 1,
   price: {
     amazon: 102.1,
     apple: 500
   }
 },
 ....
 ....
];

现在我想编写一个查询,如果price中不存在,则更新价格或插入。

让我们假设这些是用于更新/插入的输入数据:

var key1 = 'ebay', value1 = 300; // will insert
var key2 = 'amazon', value2 = 100; // will update

假设doc现在有_id: 1

类似于$addToSet运算符?,虽然$addToSet仅适用于数组&我想在对象中工作。

预期产出:

[
 {
   _id: 1,
   price: {
     amazon: 100, // updated
     apple: 500,
     ebay: 300 // inserted
   }
 },
 ....
 ....
];

我该怎样做/实现这个目标?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以动态构建更新文档,以使用 dot notation $set 运算符来正确执行更新。使用上面的示例,您需要运行以下更新操作:

db.collection.update(
    { "_id": 1 },
    {
        "$set": { "price.ebay": 300, "price.amazon": 100 } 
    }
)

因此,在给定数据输入的情况下,您需要构建一个更新文档,如{ "price.ebay": 300, "price.amazon": 100 }

使用您所描述的输入

var key1 = 'ebay', value1 = 300; // will insert
var key2 = 'amazon', value2 = 100; // will update

构造更新对象:

var query = { "_id": 1 },
    update = {};
update["price."+key1] = value1;
update["price."+key2] = value2;

db.collection.update(query, {"$set": update});