Đối với câu hỏi số 1, chúng ta hãy chia nó thành hai phần. Đầu tiên, tăng bất kỳ tài liệu nào có "items.item_name" bằng "my_item_two". Đối với điều này, bạn sẽ phải sử dụng toán tử vị trí "$". Một cái gì đó như:
db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } ,
{$inc : {"items.$.price" : 1} } ,
false ,
true);
Lưu ý rằng điều này sẽ chỉ tăng tài liệu con phù hợp đầu tiên trong bất kỳ mảng nào (vì vậy nếu bạn có một tài liệu khác trong mảng có "item_name" bằng "my_item_two", thì tài liệu đó sẽ không được tăng lên). Nhưng đây có thể là những gì bạn muốn.
Phần thứ hai phức tạp hơn. Chúng ta có thể đẩy một mục mới vào một mảng không có "my_item_two" như sau:
db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} ,
{$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
false ,
true);
Đối với câu hỏi số 2 của bạn, câu trả lời dễ dàng hơn. Để tăng tổng và giá của item_three trong bất kỳ tài liệu nào có chứa "my_item_three", bạn có thể sử dụng toán tử $ inc trên nhiều trường cùng một lúc. Một cái gì đó như:
db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
{$inc : {total : 1 , "items.$.price" : 1}} ,
false ,
true);