我有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
}
},
....
....
];
我该怎样做/实现这个目标?
感谢。
答案 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});