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

MongoDB findOneAndUpdate ()

Trong MongoDB, db.collection.findOneAndUpdate() phương pháp cập nhật một tài liệu duy nhất dựa trên filtersort tiêu chí.

Bộ sưu tập collection một phần là tên của tập hợp để thực hiện thao tác với nó.

Ví dụ

Giả sử chúng ta có một bộ sưu tập có tên là pets chứa các tài liệu sau:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Chúng ta có thể sử dụng db.collection.findOneAndUpdate() phương pháp cập nhật một trong những tài liệu đó.

db.pets.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Cow" } }
)

Kết quả:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" } 

Theo mặc định, nó trả về tài liệu gốc (không phải phiên bản đã sửa đổi).

Lưu ý rằng chỉ có một con chó được cập nhật, mặc dù có hai con chó trong bộ sưu tập.

Hãy kiểm tra bộ sưu tập.

db.pets.find()

Kết quả:

{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Chúng ta có thể thấy rằng tài liệu đầu tiên hiện có chứa một con bò thay vì một con chó.

Trả lại tài liệu đã sửa đổi

Theo mặc định, tài liệu gốc được trả về khi bạn sử dụng db.collection.findOneAndUpdate() .

Thay vào đó, nếu bạn muốn trả lại tài liệu đã sửa đổi, hãy sử dụng returnNewDocument tham số.

Hãy thực hiện một sửa đổi khác, nhưng lần này chúng ta sẽ sử dụng returnNewDocument: true .

db.pets.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Horse" } },
    { returnNewDocument: true }
)

Kết quả:

{ "_id" : 2, "name" : "Bark", "type" : "Horse" }

Lần này con chó khác đã được cập nhật. Trong trường hợp này, chúng tôi đã thay đổi nó thành một con ngựa và chúng tôi có thể thấy rằng tài liệu trả lại phản ánh điều này.

Cảnh báo phía trên

Nâng cấp là một tùy chọn mà bạn có thể sử dụng trên các hoạt động cập nhật. Nếu tài liệu đã chỉ định không tồn tại, một tài liệu mới sẽ được chèn vào. Nếu nó không tồn tại, sau đó tài liệu gốc được cập nhật (và không có tài liệu nào được chèn vào).

Bạn có thể thực hiện các cảnh báo bằng cách chỉ định upsert: true .

Ví dụ sử dụng upsert: false

Đầu tiên, đây là một ví dụ về việc cố gắng cập nhật tài liệu không tồn tại khi upsert: false .

db.pets.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        returnNewDocument: true 
    }
)

Kết quả:

null

Tài liệu không tồn tại trong bộ sưu tập và vì vậy findOneAndUpdate() trả về null . Mặc dù chúng tôi không chỉ định upsert: false , chúng tôi biết điều đó là sai vì đó là giá trị mặc định (tức là giá trị được sử dụng khi bạn không chỉ định tùy chọn nâng cấp).

Nếu chúng ta xem xét lại bộ sưu tập, chúng ta có thể thấy rằng tài liệu không được nâng cấp.

db.pets.find()

Kết quả:

{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }

Ví dụ sử dụng upsert: true

Bây giờ nó lại ở đây, nhưng lần này chúng tôi chỉ định upsert: true .

db.pets.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        upsert: true,
        returnNewDocument: true 
    }
)

Kết quả:

{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

Lần này, một tài liệu mới được nâng cấp và chúng tôi xem tài liệu được nâng cấp là đầu ra (vì chúng tôi đã chỉ định returnNewDocument: true ).

Hãy kiểm tra lại bộ sưu tập.

db.pets.find()

Kết quả:

{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

Vì vậy, chúng ta có thể thấy rằng tài liệu mới trên thực tế đã được nâng cấp.

arrayFilters Tham số

Khi làm việc với mảng, bạn có thể sử dụng arrayFilters cùng với tham số $ vị trí toán tử để xác định phần tử mảng nào cần cập nhật. Điều này cho phép bạn cập nhật một phần tử mảng dựa trên giá trị của nó, ngay cả khi bạn không biết vị trí của nó.

Ví dụ:giả sử chúng ta có một bộ sưu tập có tên là players với các tài liệu sau:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Chúng tôi có thể chạy truy vấn sau để chỉ cập nhật những phần tử mảng có giá trị cao hơn một số lượng nhất định (trong trường hợp này là 10).

db.players.findOneAndUpdate(
   { scores: { $gte: 10 } },
   { $set: { "scores.$[e]" : 10 } },
   {
       arrayFilters: [ { "e": { $gte: 10 } } ]
    }
)

Kết quả:

{ "_id" : 2, "scores" : [ 8, 17, 18 ] }

Điều này hiển thị tài liệu trước khi nó được cập nhật. Như dự kiến, điều này chỉ cập nhật một tài liệu, mặc dù hai tài liệu phù hợp với tiêu chí.

Đây là giao diện của các tài liệu bây giờ.

db.players.find()

Kết quả:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 10, 10 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Tài liệu 2 đã cập nhật hai phần tử mảng, vì những phần tử đó phù hợp với tiêu chí.

Thông tin thêm

db.collection.findOneAndUpdate() phương thức cũng chấp nhận các tham số khác, chẳng hạn như projection (để chỉ định một tập hợp con các trường cần trả về), sort , maxTimeMScollation .

Xem tài liệu MongoDB cho db.collections.findOneAndUpdate() để biết thêm thông tin.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để tính toán tổng số đang chạy bằng cách sử dụng tổng hợp?

  2. 5 cách để có được một giờ cho một buổi hẹn hò trong MongoDB

  3. Làm cách nào tôi có thể sử dụng các tweet từ api phát trực tuyến của Twitter và lưu trữ chúng trong mongodb

  4. mongodb thêm bộ đếm vào mỗi tài liệu được truy xuất

  5. Cập nhật Mảng lồng nhau với MongoDB