Theo một quan điểm, anwer là "không" và có một lý do rất chính đáng cho điều đó.
Nói chung, các hoạt động "cập nhật" trong MongoDB nhằm mục đích hoạt động trên những gì thường là "nhiều" tài liệu, do đó có nghĩa là bất kỳ tài liệu nào phù hợp với tiêu chí. Vì vậy, trường hợp chung ở đây là bất kỳ thứ gì bạn yêu cầu được cập nhật số ít hoặc theo lựa chọn đã được cập nhật hoặc không tùy thuộc vào việc có bất kỳ nội dung nào phù hợp hay không.
Trong ngữ cảnh "Hàng loạt", phần lớn điều tương tự cũng áp dụng, đó là có tiêu chí phù hợp hoặc không, trong trường hợp đó, bạn sẽ nhận được các giá trị trả về cho nMatched
và nModified
một cách tổng thể, vì cũng có khả năng tài liệu "phù hợp" không thực sự được cập nhật trong đó dữ liệu hiện tại để sửa đổi đã là giá trị là mục tiêu của việc sửa đổi.
Sự khác biệt cuối cùng giữa nMatched
và nModified
là lý do chính tại sao "bạn không thể làm điều này một cách đáng tin cậy" , vì không phải mọi thứ phù hợp đều nhất thiết phải được sửa đổi.
Tuy nhiên, bạn có thể trở thành một người bạn tâm giao giá trị trong trường hợp phân biệt giữa hành động "nâng cấp" và "cập nhật" thực tế. Nó sẽ không chính xác 100% vì sự chắt lọc đã lưu ý, nhưng quy trình cơ bản là so sánh danh sách đầu vào của bạn với giá trị trả về từ getUpsertedIds()
, là một cuộc gọi hợp lệ.
Đang áp dụng cú pháp ES6 cho phần còn lại của thế giới hiện tại:
var upserted = result.getUpsertedIds(); // get this from the bulk result
upserted = upserted.map(function(up) { return up._id }); // filter out just the _id values
var modifiedIds = edges.map(function(edge) { // get _id only from source
return edge.id;
}).filter(function(edge) {
return upserted.indexOf(edge) == -1; // and return only non upserted
});
Nơi kết quả trả về từ .getUpsertedIds()
là một mảng các đối tượng chứa cả vị trí "chỉ mục" từ cập nhật hàng loạt và _id
được tạo hoặc cung cấp giá trị của "upsert".
[ { index: 0, _id: 1 } ]
Vì vậy, hãy so khớp danh sách đầu vào của bạn với danh sách "đã nâng cấp" để xem "những gì không có ở đó" , về cơ bản trả về những thứ mà có lẽ vừa được sửa đổi. Tất nhiên, với lời cảnh báo rằng nếu giá trị đã giống với sửa đổi, thì đó thực sự không phải là một sửa đổi.
Nhưng do cách thức hoạt động của API, điều đó gần như bạn sắp đạt được.