我有以下文件
{
"_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
}
]
}
发布以下更新插入一个新的子文档,而不仅仅是更新文档。查询有问题或者upsert的工作方式有所不同吗?我尝试添加/删除子文档的id字段,但它仍然无法正常工作。我想尝试什么do是为主文档添加名称" john"的订单子文档。如果订单确实存在,则会更新。
db.mx1.update(
{"name":"john"},
{
"$addToSet":{
"orders":
{
"_id":"1",
"ordernumber":"2",
"price":1400,
"qty":1
}
}
},
{"upsert":"true"}
);
答案 0 :(得分:0)
$addToSet运算符要求将整个子文档添加到数组中,只有它是唯一的,因此您不能将其视为部分匹配或部分更新< / em>的
你可以使用下面的"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();