Với MongoDB hiện đại từ phiên bản 4.2 trở lên, bạn thực sự có thể thực hiện điều này trong một tuyên bố duy nhất:
db.collection.updateMany[
{},
[{ "$set": { "dateField": { "$toDate": "$dateField" } }}]
];
Điều này dựa trên một tính năng mới được triển khai tại phiên bản đó cho phép "các biểu thức tổng hợp" được sử dụng trong một câu lệnh thực sự có thể truy cập các giá trị hiện có của tài liệu và sử dụng chúng để tạo ra đầu ra mới.
Trong trường hợp này, $set
được sử dụng để "hợp nhất" nội dung mới với tài liệu hiện có và $toDate
xử lý việc chuyển đổi.
Câu trả lời cũ
Hiện tại không có tính năng nào trong MongoDB cho phép bạn truy cập nội dung của trường khác trong hoạt động cập nhật. Điều duy nhất bạn có thể làm trong bất kỳ ngôn ngữ nào là lặp lại kết quả:
db.collection.find[{}].forEach[function[doc] {
db.collection.update[
{ "_id": doc._id },
{"$set": { "dateField": new Date[doc.dateField] }}
];
}];
Bây giờ, bạn có thể chạy nó trên máy chủ bằng cách sử dụng db.eval[]
nhưng hãy cẩn thận vì có nhiều nguy hiểm cho việc này như được ghi lại và nó có khả năng có tác động lớn đến hệ thống sản xuất.but beware as there are many dangers to this as documented, and it is likely to have a large impact on a production system.
Thất bại rằng các tùy chọn khác của bạn dựa trên việc cập nhật của bạn để chạy càng gần càng tốt [theo thuật ngữ mạng] với cơ sở dữ liệu.update to run as close as possible [in network terms] to the database.
Ngoài ra, trên các tác phẩm cuối cùng của bạn, có vẻ như ngày của bạn không phải là tất cả ở định dạng bạn đã đề cập ở đây, nhưng một số mục chỉ có một chữ số trong tháng hoặc ngày. Vì vậy, bạn cũng sẽ phải đối phó với điều đó nếu bạn chưa có.
Tài liệu về nhà → Hướng dẫn sử dụng MongoDB → MongoDB Manual
$dateFromString
Converts chuỗi ngày/thời gian đến một đối tượng ngày.Converts a date/time string to a date object.
Biểu thức $dateFromString
có cú pháp sau:$dateFromString
expression has the following syntax:
{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } }
$dateFromString
lấy một tài liệu với các trường sau:$dateFromString
takes a document with the following fields:
| Chuỗi ngày/thời gian để chuyển đổi sang đối tượng ngày. Xem ngày để biết thêm thông tin về định dạng ngày/giờ. Ghi chúNếu chỉ định tùy chọn 0 cho nhà điều hành, không bao gồm thông tin múi giờ trong dateString .
|
2db.collection.find[{}].forEach[function[doc] {
db.collection.update[
{ "_id": doc._id },
{"$set": { "dateField": new Date[doc.dateField] }}
];
}];
Không bắt buộc. Thông số kỹ thuật định dạng ngày của dateString
.
db.collection.find[{}].forEach[function[doc] {
db.collection.update[
{ "_id": doc._id },
{"$set": { "dateField": new Date[doc.dateField] }}
];
}];
2 có thể là bất kỳ biểu thức nào đánh giá theo nghĩa đen của chuỗi, chứa 0 hoặc nhiều định dạng định dạng. Để biết danh sách các nhà xác định có sẵn, hãy xem các định dạng xác định.Format Specifiers.Nếu không xác định, $dateFromString
sử dụng
db.collection.find[{}].forEach[function[doc] {
db.collection.update[
{ "_id": doc._id },
{"$set": { "dateField": new Date[doc.dateField] }}
];
}];
6 làm định dạng mặc định.$dateFromString
uses db.collection.find[{}].forEach[function[doc] {
db.collection.update[
{ "_id": doc._id },
{"$set": { "dateField": new Date[doc.dateField] }}
];
}];
6 as the default format.
0db.collection.find[{}].forEach[function[doc] {
db.collection.update[
{ "_id": doc._id },
{"$set": { "dateField": new Date[doc.dateField] }}
];
}];
Không bắt buộc. Múi giờ để sử dụng để định dạng ngày.
Ghi chú
Nếu chỉ định tùy chọn
db.collection.find[{}].forEach[function[doc] {
db.collection.update[
{ "_id": doc._id },
{"$set": { "dateField": new Date[doc.dateField] }}
];
}];
0 cho nhà điều hành, không bao gồm thông tin múi giờ trong dateString
.
Không bắt buộc. Thông số kỹ thuật định dạng ngày của dateString
.
db.collection.find[{}].forEach[function[doc] {
db.collection.update[
{ "_id": doc._id },
{"$set": { "dateField": new Date[doc.dateField] }}
];
}];
2 có thể là bất kỳ biểu thức nào đánh giá theo nghĩa đen của chuỗi, chứa 0 hoặc nhiều định dạng định dạng. Để biết danh sách các nhà xác định có sẵn, hãy xem các định dạng xác định.một định danh thời gian Olson, chẳng hạn như
1 hoặc{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } }
2, hoặcOlson Timezone Identifier, such as{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } }
1 or{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } }
2, or{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } } Một phần bù UTC trong biểu mẫu:
3, ví dụ:{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } }
4, hoặc{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } }
5, ví dụ:{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } }
6, hoặc{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } }
7, ví dụ:{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } }
8, hoặc{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } }
Các chuỗi
9,{ $dateFromString: { dateString: , format: , timezone: , onError: , onNull: } } $set
0 hoặc$set
1
Để biết thêm thông tin về biểu thức, xem biểu thức.
$set
2
Không bắt buộc. Nếu $dateFromString
gặp lỗi trong khi phân tích cú pháp ____99 đã cho, nó sẽ xuất ra giá trị kết quả của biểu thức $set
2 được cung cấp. Giá trị kết quả này có thể là bất kỳ loại.$dateFromString
encounters an error while parsing the given dateString
, it outputs the result value of the provided $set
2 expression. This result value can be of any type.
Nếu bạn không chỉ định $set
2, $dateFromString
đã ném lỗi nếu nó không thể phân tích được dateString
.$dateFromString
throws an error if it cannot parse dateString
.
$set
9
Không bắt buộc. Nếu dateString
được cung cấp cho $dateFromString
là $toDate
2 hoặc thiếu, nó sẽ xuất ra giá trị kết quả của biểu thức $set
9 được cung cấp. Giá trị kết quả này có thể là bất kỳ loại.$dateFromString
is $toDate
2 or missing, it outputs the result value of the provided $set
9 expression. This result value can be of any type.
Nếu bạn không chỉ định $set
9 và dateString
là $toDate
2 hoặc bị thiếu, thì $dateFromString
sẽ xuất hiện $toDate
2.$dateFromString
outputs $toDate
2.