Khi sử dụng mongoimport
để nhập tệp vào MongoDB, bạn có tùy chọn chỉ định chế độ để sử dụng. Các chế độ này xác định điều gì sẽ xảy ra nếu đã có tài liệu khớp trong bộ sưu tập mà bạn đang cố gắng nhập vào.
Theo mặc định, mongoimport
sử dụng insert
nhưng có những chế độ khác mà bạn có thể sử dụng. Chế độ bạn sử dụng sẽ phụ thuộc vào những gì bạn đang cố gắng thực hiện.
Dưới đây là tổng quan về từng chế độ cùng với các ví dụ.
Các chế độ
Các chế độ nhập có sẵn trong mongoimport
như sau:
Chế độ | Mô tả |
---|---|
insert | Đây là chế độ mặc định. Chế độ này sẽ chèn các tài liệu từ tệp nhập. Nếu một tài liệu phù hợp đã tồn tại trong bộ sưu tập, thì sẽ xảy ra lỗi. Tài liệu phù hợp là tài liệu có cùng một ID duy nhất (chẳng hạn như _id phù hợp trường) dưới dạng tài liệu trong tệp nhập. |
upsert | Thay thế các tài liệu hiện có trong cơ sở dữ liệu bằng các tài liệu phù hợp từ tệp nhập. Tất cả các tài liệu khác đã được chèn. |
merge | Hợp nhất tài liệu hiện có khớp với tài liệu trong tệp nhập với tài liệu mới. Tất cả các tài liệu khác đã được chèn. |
delete | Xóa tài liệu hiện có trong cơ sở dữ liệu khớp với tài liệu trong tệp nhập. Mọi tài liệu không khớp đều không có hiệu lực. |
Dưới đây là ví dụ về cách hoạt động của từng chế độ.
Chế độ Chèn
Giả sử chúng ta có một bộ sưu tập có tên là pets
với 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" }
Hóa ra, chúng đã được nhập vào một tệp có tên là pets.json
.
Bây giờ, hãy tưởng tượng chúng ta có một tệp JSON khác được gọi là pets2.json
, chứa các tài liệu JSON sau:
{ "_id" : 1, "weight": 40 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight": 10 } { "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight": 5 } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight": 3 }
Đây là những gì sẽ xảy ra nếu chúng tôi cố gắng nhập dữ liệu đó vào pets
của mình bộ sưu tập trong khi sử dụng (mặc định) insert
chế độ.
mongoimport --db=PetHotel --collection=pets --file=pets2.json
Đầu ra:
2021-01-03T10:07:23.421+1000 connected to: mongodb://localhost/ 2021-01-03T10:07:23.422+1000 continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 1 } 2021-01-03T10:07:23.422+1000 continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 2 } 2021-01-03T10:07:23.422+1000 continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 3 } 2021-01-03T10:07:23.423+1000 1 document(s) imported successfully. 3 document(s) failed to import.
Theo thông báo lỗi đó, chỉ một trong bốn tài liệu được nhập. Ba khóa còn lại gây ra lỗi do có một khóa trùng lặp trong _id
trường.
Bây giờ chúng ta hãy xem xét bộ sưu tập.
db.pets.find()
Kết quả:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight" : 3 }
Vì vậy, chúng ta có thể thấy rằng tài liệu cuối cùng đã được chèn. Điều này được mong đợi, vì trước đây chúng tôi không có tài liệu nào có _id
giá trị của 4
.
Chế độ nâng cấp
Đây là những gì sẽ xảy ra nếu chúng tôi sử dụng upsert
để chèn cùng một tài liệu.
mongoimport --db=PetHotel --collection=pets --mode=upsert --file=pets2.json
Đầu ra:
2021-01-03T10:19:55.400+1000 connected to: mongodb://localhost/ 2021-01-03T10:19:55.444+1000 3 document(s) imported successfully. 0 document(s) failed to import.
Kết quả cho chúng ta biết rằng 3 trong số 4 tài liệu đã được nhập thành công và không có lỗi nào.
Hãy kiểm tra bộ sưu tập.
db.pets.find()
Kết quả:
{ "_id" : 1, "weight": 40 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight": 10 } { "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight": 5 } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight": 3 }
Chúng ta có thể thấy rằng ba tài liệu đầu tiên đã được thay thế bằng các tài liệu từ tệp nhập. Tài liệu thứ tư vẫn giữ nguyên như sau lần nhập trước.
Lưu ý rằng tài liệu đầu tiên đã bị mất name
và type
lĩnh vực. Điều này là do upsert
chế độ thay thế toàn bộ tài liệu và tài liệu thay thế của chúng tôi chỉ có weight
trường (cũng như _id
đồng ruộng).
Chế độ hợp nhất
Hãy sửa đổi pets2.json
của chúng tôi tệp sao cho nó trông giống như sau:
{ "_id" : 1, "name": "Wag", "type": "Dog" } { "_id" : 2, "name" : "Fetch" } { "_id" : 3, "name" : "Scratch" } { "_id" : 4, "name" : "Bubbles" } { "_id" : 5, "name" : "Hop", "type": "Kangaroo" }
Bây giờ chúng ta hãy chạy mongoimport
lệnh một lần nữa, nhưng lần này trong merge
chế độ:
mongoimport --db=PetHotel --collection=pets --mode=merge --file=pets2.json
Đầu ra:
2021-01-03T10:32:33.596+1000 connected to: mongodb://localhost/ 2021-01-03T10:32:33.607+1000 3 document(s) imported successfully. 0 document(s) failed to import.
Theo kết quả đầu ra, 3 tài liệu đã được nhập khẩu.
Hãy xem bộ sưu tập.
db.pets.find()
Kết quả:
{ "_id" : 1, "weight" : 40, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Fetch", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight" : 5 } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight" : 3 } { "_id" : 5, "name" : "Hop", "type" : "Kangaroo" }
Chúng ta có thể thấy rằng tài liệu 1 và 2 đã được cập nhật, và tài liệu 5 đã được chèn vào. Về tài liệu 1, weight
trường vẫn còn mặc dù tài liệu nhập không bao gồm trường đó. Điều này là do chúng tôi đã sử dụng merge
cách thức. Nếu chúng tôi đã sử dụng upsert
(như trong ví dụ trước), weight
trường sẽ biến mất.
Chế độ xóa
Khi bạn sử dụng delete
chế độ, mọi tài liệu phù hợp sẽ bị xóa đơn giản. Các tài liệu không khớp vẫn còn trong bộ sưu tập.
Vì vậy, hãy xem điều gì sẽ xảy ra khi chúng tôi nhập cùng một tài liệu, nhưng lần này chuyển sang delete
chế độ.
mongoimport --db=PetHotel --collection=pets --mode=delete --file=pets2.json
Kết quả:
2021-01-03T10:39:38.925+1000 connected to: mongodb://localhost/ 2021-01-03T10:39:38.926+1000 5 document(s) deleted successfully. 0 document(s) failed to delete.
Tất cả 5 tài liệu trong bộ sưu tập đã bị xóa.
Thay đổi / s Trường nâng cấp
Bạn có thể sử dụng --upsertFields
tham số để chỉ định một trường không phải là _id
để so khớp với. Khi sử dụng tham số này, hãy chuyển các trường dưới dạng danh sách được phân tách bằng dấu phẩy.
Không chắc nếu bạn có mongoimport
?
mongoimport
là một phần của gói Công cụ cơ sở dữ liệu MongoDB. Công cụ cơ sở dữ liệu MongoDB là một bộ tiện ích dòng lệnh để làm việc với MongoDB.
Nếu bạn không chắc mình có Công cụ cơ sở dữ liệu MongoDB / mongoimport
hay không đã cài đặt, hãy thử chạy lệnh sau trong Terminal hoặc Command Prompt của bạn để kiểm tra:
mongoimport --version
Nếu có, bạn sẽ thấy thông tin phiên bản, v.v. Nếu chưa có, bạn có thể sử dụng hướng dẫn cài đặt trên trang web MongoDB để cài đặt vào hệ thống của mình.
Chạy ở đâu mongoimport
Lệnh?
Bạn cần chạy mongoimport
lệnh từ dòng lệnh của hệ thống của bạn (ví dụ:cửa sổ Terminal hoặc Command Prompt mới).
Đừng chạy chúng từ mongo
vỏ bọc.