我有一份下面的文件
{
"_id" : ObjectId("56d2f6e83b6c835ebf12de33"),
"name" : "john",
"age" : 50,
"places" : [
"a",
"b",
"c"
],
"orders" : [
{
"_id" : 1,
"ordernumber" : 1,
"price" : 100,
"quantity" : 2
},
{
"_id" : 2,
"ordernumber" : "2",
"price" : 1400.0000000000000000,
"qty" : 10.0000000000000000
},
{
"_id" : 1.0000000000000000,
"ordernumber" : "2",
"price" : 1400.0000000000000000,
"qty" : 1.0000000000000000
},
{
"_id" : "1",
"ordernumber" : "2",
"price" : 1400.0000000000000000,
"qty" : 1.0000000000000000
}
]
}发出update insert一个新的子文档而不是仅仅更新document.Is查询有什么问题,或者upsert的工作方式不同?我试着添加/删除子文档的id字段,但它仍然不work.What我正在尝试做的是为名为"john“的主文档添加order子文档,如果订单确实存在,它将被更新。
db.mx1.update(
{"name":"john"},
{
"$addToSet":{
"orders":
{
"_id":"1",
"ordernumber":"2",
"price":1400,
"qty":1
}
}
},
{"upsert":"true"}
); 发布于 2016-02-28 22:16:07
$addToSet运算符要求只有在子文档是唯一的情况下,才将整个子文档添加到数组中,因此不能将其视为部分匹配或部分更新。
您可以使用"Bulk Operations API"执行此操作,如下所示
var bulk = db.mx1.initializeOrderedBulkOp();
// if we find the match order _id, update this order
bulk.find({name: 'john', 'orders._id': 1}).updateOne({
{$set: {'orders.$': {_id: 1, ordernumber: '2', price: 1400, qty: 1}}}
});
// if we cannot find match order _id, insert the new one
bulk.find({name: 'john', 'orders._id': {$ne: 1}}).updateOne({
{$addToSet: {orders: {_id: 1, ordernumber: '2', price: 1400, qty: 1}}}
});
bulk.execute();https://stackoverflow.com/questions/35683238
复制相似问题