Hướng dẫn python mongodb update_one upsert - python mongodb update_one upsert

Tôi có một yêu cầu Python trả về dữ liệu API ở định dạng JSON như bên dưới:

[
 {
  'name': 'xyz',
  'address': 'yyy'
 },
 {
  'name': 'abc',
  'address': 'ccc'
 }
]

Tôi muốn tải dữ liệu này bằng MongoDB mỗi ngày vì không phân biệt nếu có bất kỳ thay đổi nào để giải quyết từ đầu ra phản hồi API JSON hay không, cùng với trường DatetImestamp được thêm vào mỗi lần chèn/cập nhật tài liệu cho mỗi khóa tên trong đối tượng JSON , như dưới đây:name key in json object, like below:

 { 
  'id' : objectid(123456),
  'name': 'xyz',
  'address': 'yyy'
  'dttm' : 2020-08-26:01:20:30'
 },
 {
  'id' : objectid(123457),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-08-26:01:20:30'
 }
 { 
  'id' : objectid(123458),
  'name': 'xyz',
  'address': 'zzzzzzzzzzzzzzzzzzz'
  'dttm' : 2020-09-26:03:01:20'
 },
 {
  'id' : objectid(123459),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-09-26:03:02:30'
 }

]

Trong ví dụ trên - Tên "XYZ" có thay đổi địa chỉ từ lần chạy trước đó, nhưng tên "ABC" không có thay đổi nhưng vẫn tải với một bộ dữ liệu khác nhau

Mã mẫu:

import requests
import json
from pymongo import MongoClient

url='xxx'
header={'Auth':'xyz', 'Content-Type': 'application/json'}
payload={}
api_data = requests.request("POST", url, data=json.dumps(payload), headers=header).json()

client = MongoClient('mongodb://localhost:27017') 
db = client[test_db][test_collection]

db.update_one({api_data}, {$set:{dttm:datetime.today()}},{'upsert':True}) ##===>>what is the valid way to construct this using PyMongo ??

client.close()

Tài liệu về nhà → Hướng dẫn sử dụng MongoDBMongoDB Manual


Sử dụng menu chọn ngôn ngữ của bạn ở phía trên bên phải để đặt ngôn ngữ của các ví dụ sau.Select your language drop-down menu in the upper-right to set the language of the following examples.


Ghi chú

Bắt đầu từ MongoDB 4.2, MongoDB có thể chấp nhận một đường ống tổng hợp để chỉ định các sửa đổi để thực hiện thay vì tài liệu cập nhật. Xem trang tham chiếu phương thức để biết chi tiết.

Tất cả các hoạt động viết trong MongoDB đều là nguyên tử ở cấp độ của một tài liệu. Để biết thêm thông tin về MongoDB và tính nguyên tử, hãy xem tính nguyên tử và giao dịch.

Sau khi được đặt, bạn không thể cập nhật giá trị của trường _id và bạn cũng không thể thay thế một tài liệu hiện có bằng một tài liệu thay thế có giá trị trường _id khác.

Đối với các hoạt động ghi, MongoDB bảo tồn thứ tự của các trường tài liệu ngoại trừ các trường hợp sau:

  • Trường _id luôn là trường đầu tiên trong tài liệu.

  • Các bản cập nhật bao gồm

     { 
      'id' : objectid(123456),
      'name': 'xyz',
      'address': 'yyy'
      'dttm' : 2020-08-26:01:20:30'
     },
     {
      'id' : objectid(123457),
      'name': 'abc',
      'address': 'ccc'
      'dttm' : 2020-08-26:01:20:30'
     }
     { 
      'id' : objectid(123458),
      'name': 'xyz',
      'address': 'zzzzzzzzzzzzzzzzzzz'
      'dttm' : 2020-09-26:03:01:20'
     },
     {
      'id' : objectid(123459),
      'name': 'abc',
      'address': 'ccc'
      'dttm' : 2020-09-26:03:02:30'
     }
    
    ]
    
    2 tên trường có thể dẫn đến việc sắp xếp lại các trường trong tài liệu.

Với các mối quan tâm ghi, bạn có thể chỉ định mức độ xác nhận được yêu cầu từ MongoDB cho các hoạt động viết. Để biết chi tiết, xem Viết mối quan tâm.

upsert là một boolean cấu hình điều gì sẽ xảy ra khi không có bản khi khớp với filter. Nếu upsert = true thì nó sẽ thêm mới bản ghi đó nếu không có bản ghi nào khớp với filter và sẽ không có điều gì xảy ra nếu upsert = false. Mặc định thì upsert = false.update một hoặc nhiều bản ghi trong MongoDB.

multi là một boolean cấu hình xem có cho phép sửa đổi nhiều bản ghi hay không, multi bằng true là cho phép và ngược lại bằng false thì là không. Mặc định thì thuộc tính này có giá trị là false.

VD3: Sửa đổi name của một bản ghi duy nhất có name là "Toidicode" thành "Vu Thanh Tai".

db.collectionName.updateOne(
    filter,
    update,
    {
        upsert: <boolean>,
        writeConcern: <document>
        collation: <document>,
    }
)

Trong đó::

  • filter là một object chứa các tiêu chí lựa chọn bản ghi update (sử dụng cú pháp selector).
  • update là object chứa dữ liệu sửa đổi trên bản ghi.
  • upsert là một boolean cấu hình điều gì sẽ xảy ra khi không có bản khi khớp với filter. Nếu upsert = true thì nó sẽ thêm mới bản ghi đó nếu không có bản ghi nào khớp với filter và sẽ không có điều gì xảy ra nếu upsert = false. Mặc định thì upsert = false.
  • writeConcern là một document chứa write concern.
  • collation là một document chứa các quy tắc.

-Lưu ý: Phương thức này chỉ khác với phương thức updateOne() ở chỗ: Nếu như số lượng bản ghi so khớp với filter lớn hơn 1 bản ghi thì nó sẽ sửa dữ liệu trên tất cả các bản ghi đó.: Khi sử dụng phương thức

 { 
  'id' : objectid(123456),
  'name': 'xyz',
  'address': 'yyy'
  'dttm' : 2020-08-26:01:20:30'
 },
 {
  'id' : objectid(123457),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-08-26:01:20:30'
 }
 { 
  'id' : objectid(123458),
  'name': 'xyz',
  'address': 'zzzzzzzzzzzzzzzzzzz'
  'dttm' : 2020-09-26:03:01:20'
 },
 {
  'id' : objectid(123459),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-09-26:03:02:30'
 }

]
3 nếu như dữ liệu khớp với filter nhiều hơn một bản ghi thì nó sẽ chỉ sửa đổi cho một bản ghi đầu tiên.

VD2: Sửa name của admin có name = "Vu Thanh Tai" thành Toidicode.: Sửa name của admin có tuổi = 18 thành Toidicode.

db.admin.updateOne(
    {age: 18},
    {
        $set: {
            name: "Toidicode"
        }
    }
)

Hướng dẫn python mongodb update_one upsert - python mongodb update_one upsert

Hình minh họa

3, Sửa đổi bản ghi trong MongoDB.

-Ngoài 2 phương thức trên thì trong MongoDB còn cung cấp cho chúng ta một phương thức update() có thể cấu hình

 { 
  'id' : objectid(123456),
  'name': 'xyz',
  'address': 'yyy'
  'dttm' : 2020-08-26:01:20:30'
 },
 {
  'id' : objectid(123457),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-08-26:01:20:30'
 }
 { 
  'id' : objectid(123458),
  'name': 'xyz',
  'address': 'zzzzzzzzzzzzzzzzzzz'
  'dttm' : 2020-09-26:03:01:20'
 },
 {
  'id' : objectid(123459),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-09-26:03:02:30'
 }

]
3 hoặc
 { 
  'id' : objectid(123456),
  'name': 'xyz',
  'address': 'yyy'
  'dttm' : 2020-08-26:01:20:30'
 },
 {
  'id' : objectid(123457),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-08-26:01:20:30'
 }
 { 
  'id' : objectid(123458),
  'name': 'xyz',
  'address': 'zzzzzzzzzzzzzzzzzzz'
  'dttm' : 2020-09-26:03:01:20'
 },
 {
  'id' : objectid(123459),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-09-26:03:02:30'
 }

]
5, sử dụng theo cú pháp sau:

db.collectionName.updateOne(
    filter,
    update,
    {
        upsert: <boolean>,
        writeConcern: <document>
        collation: <document>,
    }
)

Trong đó::

  • filter là một object chứa các tiêu chí lựa chọn bản ghi update (sử dụng cú pháp selector).
  • update là object chứa dữ liệu sửa đổi trên bản ghi.
  • upsert là một boolean cấu hình điều gì sẽ xảy ra khi không có bản khi khớp với filter. Nếu upsert = true thì nó sẽ thêm mới bản ghi đó nếu không có bản ghi nào khớp với filter và sẽ không có điều gì xảy ra nếu upsert = false. Mặc định thì upsert = false.
  • writeConcern là một document chứa write concern.
  • collation là một document chứa các quy tắc.

-Lưu ý: Phương thức này chỉ khác với phương thức updateOne() ở chỗ: Nếu như số lượng bản ghi so khớp với filter lớn hơn 1 bản ghi thì nó sẽ sửa dữ liệu trên tất cả các bản ghi đó.Lưu ý: Phương thức này chỉ khác với phương thức updateOne() ở chỗ: Nếu như số lượng bản ghi so khớp với filter lớn hơn 1 bản ghi thì nó sẽ sửa dữ liệu trên tất cả các bản ghi đó.

VD2: Sửa name của admin có name = "Vu Thanh Tai" thành Toidicode.: Sửa name của admin có name = "Vu Thanh Tai" thành Toidicode.

db.admin.updateMany(
    {name: "Vu Thanh Tai"},
    {
        $set: {
            name: "Toidicode"
        }
    }
)

Hướng dẫn python mongodb update_one upsert - python mongodb update_one upsert

Hình minh họa

3, Sửa đổi bản ghi trong MongoDB.

-Ngoài 2 phương thức trên thì trong MongoDB còn cung cấp cho chúng ta một phương thức update() có thể cấu hình

 { 
  'id' : objectid(123456),
  'name': 'xyz',
  'address': 'yyy'
  'dttm' : 2020-08-26:01:20:30'
 },
 {
  'id' : objectid(123457),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-08-26:01:20:30'
 }
 { 
  'id' : objectid(123458),
  'name': 'xyz',
  'address': 'zzzzzzzzzzzzzzzzzzz'
  'dttm' : 2020-09-26:03:01:20'
 },
 {
  'id' : objectid(123459),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-09-26:03:02:30'
 }

]
3 hoặc
 { 
  'id' : objectid(123456),
  'name': 'xyz',
  'address': 'yyy'
  'dttm' : 2020-08-26:01:20:30'
 },
 {
  'id' : objectid(123457),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-08-26:01:20:30'
 }
 { 
  'id' : objectid(123458),
  'name': 'xyz',
  'address': 'zzzzzzzzzzzzzzzzzzz'
  'dttm' : 2020-09-26:03:01:20'
 },
 {
  'id' : objectid(123459),
  'name': 'abc',
  'address': 'ccc'
  'dttm' : 2020-09-26:03:02:30'
 }

]
5, sử dụng theo cú pháp sau:

db.collection.update(
   filter,
   update,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>
   }
)

Trong đó::

  • filter là một object chứa các tiêu chí lựa chọn bản ghi update (sử dụng cú pháp selector).
  • update là object chứa dữ liệu sửa đổi trên bản ghi.
  • upsert là một boolean cấu hình điều gì sẽ xảy ra khi không có bản khi khớp với filter. Nếu upsert = true thì nó sẽ thêm mới bản ghi đó nếu không có bản ghi nào khớp với filter và sẽ không có điều gì xảy ra nếu upsert = false. Mặc định thì upsert = false.
  • multi là một boolean cấu hình xem có cho phép sửa đổi nhiều bản ghi hay không, multi bằng true là cho phép và ngược lại bằng false thì là không. Mặc định thì thuộc tính này có giá trị là false.
  • writeConcern là một document chứa write concern.
  • collation là một document chứa các quy tắc.

VD3: Sửa đổi name của một bản ghi duy nhất có name là "Toidicode" thành "Vu Thanh Tai".: Sửa đổi name của một bản ghi duy nhất có name là "Toidicode" thành "Vu Thanh Tai".

db.admin.updateOne(
    {name: "Vu Thanh Tai"},
    {
        $set: {
            name: "Toidicode"
        }
    },
    {
        multi : false
    }
)

Hướng dẫn python mongodb update_one upsert - python mongodb update_one upsert

Hình minh họa

4, Lời kết.

-Như vậy phần này mình đã hướng dẫn đến mọi người 3 cách để sửa đổi dữ liệu trong collection rồi, bài tiếp theo chúng ta sẽ tìm hiểu về các cách xóa dữ liệu trong collection.sửa đổi dữ liệu trong collection rồi, bài tiếp theo chúng ta sẽ tìm hiểu về các cách xóa dữ liệu trong collection.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Bài Viết Mới