MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm thế nào để kéo một phiên bản của một mục trong một mảng trong MongoDB?

Vì vậy, bạn đã đúng ở chỗ $pull toán tử thực hiện chính xác những gì tài liệu nói trong đó các đối số của nó thực chất là một "truy vấn" được sử dụng để khớp với các phần tử sẽ bị loại bỏ.

Nếu nội dung mảng của bạn tình cờ luôn có phần tử ở vị trí "đầu tiên" như bạn hiển thị thì $pop thực tế là toán tử loại bỏ phần tử đầu tiên đó.

Với trình điều khiển nút cơ bản:

collection.findOneAndUpdate(
    { "array.0": "bird" },       // "array.0" is matching the value of the "first" element 
    { "$pop": { "array": -1 } },
    { "returnOriginal": false },
    function(err,doc) {

    }
);

Với mongoose, đối số để trả về tài liệu đã sửa đổi là khác nhau:

MyModel.findOneAndUpdate(
    { "array.0": "bird" },
    { "$pop": { "array": -1 } },
    { "new": true },
    function(err,doc) {

    }
);

Nhưng cũng không được sử dụng nhiều nếu vị trí mảng của mục "đầu tiên" cần loại bỏ không được xác định.

Đối với cách tiếp cận chung ở đây, bạn cần "hai" cập nhật, là một để khớp với mục đầu tiên và thay thế nó bằng một thứ duy nhất sẽ bị xóa và lần thứ hai để thực sự xóa mục đã sửa đổi đó.

Điều này đơn giản hơn rất nhiều nếu áp dụng các bản cập nhật đơn giản và không yêu cầu tài liệu được trả lại và cũng có thể được thực hiện hàng loạt trên các tài liệu. Nó cũng hữu ích để sử dụng một cái gì đó như async.series để tránh lồng các cuộc gọi của bạn:

async.series(
    [
        function(callback) {
            collection.update(
                { "array": "bird" },
                { "$unset": { "array.$": "" } },
                { "multi": true }
                callback
            );
        },
       function(callback) {
           collection.update(
                { "array": null },
                { "$pull": { "array": null } },
                { "multi": true }
                callback
           );
       }
    ],
    function(err) {
       // comes here when finished or on error   
    }
);

Vì vậy, bằng cách sử dụng $unset tại đây với $ vị trí toán tử cho phép thay đổi mục "đầu tiên" thành null . Sau đó, truy vấn tiếp theo với $pull chỉ cần xóa mọi null mục nhập từ mảng.

Đó là cách bạn loại bỏ sự xuất hiện "đầu tiên" của một giá trị khỏi một mảng một cách an toàn. Để xác định xem mảng đó có chứa nhiều hơn một giá trị giống nhau hay không là một câu hỏi khác.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào chúng ta có thể tạo trường được tạo Tự động cho mongodb bằng cách sử dụng khởi động mùa xuân

  2. Nhập dữ liệu vào các phiên bản MongoDB mới được tạo của bạn

  3. MongoDB:Tìm tài liệu con trong tham số so khớp mảng

  4. MongoDB $ min

  5. SchemaType trong Mongoose nào là tốt nhất cho Dấu thời gian?