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

MongoDB findOneAndReplace ()

Trong MongoDB, db.collection.findOneAndReplace() phương thức thay thế một tài liệu dựa trên bộ lọc được chỉ định.

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.findOneAndReplace() phương pháp thay thế một trong những tài liệu đó.

db.pets.findOneAndReplace(
   { "type": "Dog" },
   { "name": "Bruno", "type" : "Horse" }
)

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" : "Bruno", "type" : "Horse" }
{ "_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 đã được thay thế bằng tài liệu mới.

Lưu ý rằng tài liệu thay thế không thể chỉ định _id giá trị khác với _id giá trị trong tài liệu được thay thế.

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

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

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.findOneAndReplace(
   { "type": "Dog" },
   { "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
   { returnNewDocument: true }
)

Kết quả:

{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }

Lần này con chó khác đã được cập nhật. Trong trường hợp này, chúng tôi đã thực hiện một thay đổi quan trọng hơn 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.

Chúng tôi có thể kiểm tra lại bộ sưu tập để xem tài liệu được thay thế.

db.pets.find()

Kết quả:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

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.findOneAndReplace(
   { "_id": 4 },
   { "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
   {
       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 findOneAndReplace() trả về null . Mặc dù chúng tôi không chỉ định rõ ràng 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, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "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.findOneAndReplace(
   { "_id": 4 },
   { "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
   {
       upsert: true,
       returnNewDocument: true
    }
)

Kết quả:

{
	"_id" : 4,
	"name" : "Fluffy",
	"type" : "Pooch",
	"DOB" : "2019-12-03",
	"points" : 20
}

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" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }

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.

sort Tham số

Bạn có thể sử dụng sort tham số để chỉ định thứ tự sắp xếp cho các tài liệu được khớp với filter .

Khi sử dụng sort tham số, giá trị của 1 sắp xếp các tài liệu theo thứ tự tăng dần và giá trị -1 sắp xếp chúng theo thứ tự giảm dần.

Đối số cần được cung cấp dưới dạng tài liệu. Ví dụ:{ sort: { "salary": 1 } } sắp xếp theo salary trường theo thứ tự tăng dần.

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

db.employees.insertMany([
    { _id: 1, name: "Sandy", salary: 55000 },
    { _id: 2, name: "Sarah", salary: 128000 },
    { _id: 3, name: "Fritz", salary: 25000 },
    { _id: 4, name: "Chris", salary: 45000 },
    { _id: 5, name: "Beck", salary: 82000 }
    ])

Chúng tôi có thể chạy mã sau để tìm tài liệu có mức lương dưới 60000, sau đó thay thế tài liệu có mức lương thấp nhất trong số các tài liệu đó.

db.employees.findOneAndReplace(
   { "salary": { $lt: 60000 } },
   { "name": "Fluffy", "salary": 250000 },
   {
       sort: { "salary": 1 }
    }
)

Kết quả:

{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }

Điều này hiển thị tài liệu trước khi nó được cập nhật. Đúng như dự đoán, nhân viên có mức lương thấp nhất đã được thay thế bằng một mức lương mới (và một cái tên mới).

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

db.employees.find()

Kết quả:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fluffy", "salary" : 250000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Vì vậy, chúng ta có thể thấy rằng Fritz đã được thay thế bằng Fluffy, người có mức lương tốt hơn nhiều.

Hãy hoàn nguyên nó về tài liệu ban đầu.

db.employees.remove({})
db.employees.insertMany([
    { _id: 1, name: "Sandy", salary: 55000 },
    { _id: 2, name: "Sarah", salary: 128000 },
    { _id: 3, name: "Fritz", salary: 25000 },
    { _id: 4, name: "Chris", salary: 45000 },
    { _id: 5, name: "Beck", salary: 82000 }
    ])

Bây giờ chúng ta hãy chạy cùng một findOneAndReplace() mã lại, nhưng lần này chúng tôi sẽ sắp xếp nó theo thứ tự giảm dần.

db.employees.findOneAndReplace(
   { "salary": { $lt: 60000 } },
   { "name": "Fluffy", "salary": 250000 },
   {
       sort: { "salary": -1 }
    }
)

Kết quả:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }

Lần này Sandy đã được thay thế.

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

db.employees.find()

Kết quả:

{ "_id" : 1, "name" : "Fluffy", "salary" : 250000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Như mong đợi.

Thông tin thêm

db.collection.findOneAndReplace() 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ề), maxTimeMScollation .

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sửa lỗi "$ pullAll yêu cầu một đối số mảng nhưng đã được cung cấp một đôi" trong MongoDB

  2. Nhận dấu thời gian unix trong vài giây từ MongoDB ISODate trong quá trình tổng hợp

  3. Mongodb $ nơi truy vấn luôn đúng với nodejs

  4. Làm cách nào để tôi có thể xây dựng một chương trình bằng cách sử dụng trình điều khiển c ++ của mongodb?

  5. Cách truy vấn mongodb với DBRef