SchemaType trong Mongoose nào tốt nhất cho Timestamp?


83

Tôi đang sử dụng Mongoose, MongoDB và Node.

Tôi muốn xác định một lược đồ trong đó một trong các trường của nó là date \ timestamp.

Tôi muốn sử dụng trường này để trả về tất cả các bản ghi đã được cập nhật trong 5 phút qua.

Do trong Mongoose, tôi không thể sử dụng phương thức Dấu thời gian (), tôi hiểu rằng lựa chọn duy nhất của tôi là sử dụng phương thức Javascript sau:

time : { type: Number, default: (new Date()).getTime() } 

Nó có lẽ không phải là cách hiệu quả nhất để truy vấn một DB khổng lồ. Tôi thực sự sẽ đánh giá cao nếu ai đó có thể chia sẻ một cách hiệu quả hơn để thực hiện điều này.

Có cách nào để thực hiện điều này với Mongoose và có thể sử dụng dấu thời gian MongoDB không?

Câu trả lời:


135

Chỉnh sửa - ngày 20 tháng 3 năm 2016

Mongoose hiện hỗ trợ dấu thời gian cho các bộ sưu tập .

Hãy xem xét câu trả lời của @bobbyz dưới đây . Có thể đây là những gì bạn đang tìm kiếm.

Câu trả lời ban đầu

Mongoose hỗ trợ một Dateloại (về cơ bản là dấu thời gian):

time : { type : Date, default: Date.now }

Với định nghĩa trường ở trên, bất cứ khi nào bạn lưu tài liệu với timetrường chưa đặt , Mongoose sẽ điền vào trường này với thời gian hiện tại.

Nguồn: http://mongoosejs.com/docs/guide.html


Cảm ơn bạn rất nhiều vì câu trả lời nhưng điều tôi đang cố gắng hiểu là cách tốt nhất để truy vấn để trả về tất cả các bản ghi đã được cập nhật trong 5 phút qua. Ý bạn là tôi nên sử dụng: date: {$ gt: ((Math.round ((new Date ()). GetTime () / 1000)) - 300)}
Liatz

1
@ user1103897 bạn có thể tạo đối tượng Date trực tiếp và sử dụng nó với $ gt như sau: var now = new Date (); var fiveminago = new Date (now.getTime () - 5 * 60 * 1000); sau đó truy vấn với {date: {$ gt: fiveminago}}
mpobrien

19
Có lẽ nên được Date.nowthay vì Date.now().
Aleksei Zabrodskii 25/12/12

1
1 elmigranto, Mongoose tài liệu ví dụ sử dụng Date.now mongoosejs.com/docs/guide.html
Aaron

19
Giải thích: Date.nowDate.nowlà một hàm sẽ được chạy khi bạn tạo các đối tượng. Date.now()là ngày mà bạn models.jsđã được phân tích cú pháp. Tức là, nếu bạn sử dụng Date.now()tất cả các đối tượng của bạn sẽ có cùng một ngày và đó sẽ là ngày models.jsđược phân tích cú pháp.
mikemaccana

115

Phiên bản hiện tại của Mongoose (v4.x) có thời gian đóng dấu như một tùy chọn được tích hợp sẵn cho một giản đồ:

var mySchema = new mongoose.Schema( {name: String}, {timestamps: true} );

Tùy chọn này thêm createdAtupdatedAtcác thuộc tính được đánh dấu thời gian bằng a Date, và tùy chọn này thực hiện tất cả công việc cho bạn. Bất kỳ lúc nào bạn cập nhật tài liệu, nó sẽ cập nhật thuộc updatedAttính. Sơ đồ Dấu thời gian Tài liệu.


3
Cảm ơn bạn, tài liệu không rõ ràng rằng người ta có thể sử dụng timestamps: truethay vì ghi đè tên bằng cách sử dụng timestamps: {...}.
tar

2
@tar Tôi cho rằng nó vẫn đang hoạt động, nhưng tài liệu 4.x được sử dụng để đề cập cụ thể timestamps: true, vì vậy có thể cần thêm một số cân nhắc về sau. (? Có thể họ sẽ không chấp nhận nó bạn nói đúng, các tài liệu không phải là rất rõ ràng đối với tùy chọn này.)
bobbyz

14

Trong trường hợp bạn muốn có tên tùy chỉnh cho createAt và updatedAt của mình

const mongoose = require('mongoose');  
const { Schema } = mongoose;

const schemaOptions = {
  timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' },
};

const mySchema = new Schema({ name: String }, schemaOptions);

1
Cảm ơn bạn!!! Điều này rất hữu ích. Đang tìm kiếm tài liệu nhưng không thể tìm thấy cách thực hiện việc này. Cảm ơn một lần nữa vì đã chia sẻ.
Greg


0

Tôi muốn sử dụng trường này để trả lại tất cả các bản ghi đã được cập nhật trong 5 phút qua.

Điều này có nghĩa là bạn cần cập nhật ngày thành "bây giờ" mỗi khi lưu đối tượng. Có thể bạn sẽ thấy điều này hữu ích: Plugin sửa đổi tạo Moongoose


-2

Đầu tiên : npm install mongoose-timestamp

Kế tiếp: let Timestamps = require('mongoose-timestamp')

Kế tiếp: let MySchema = new Schema

Kế tiếp: MySchema.plugin(Timestamps)

Kế tiếp : const Collection = mongoose.model('Collection',MySchema)

Sau đó, bạn có thể sử dụng Collection.createdAthoặc Collection.updatedAtbất cứ nơi nào bạn muốn.

Được tạo vào: Ngày trong tuần Tháng Ngày Năm 00:00:00 GMT

Thời gian ở định dạng này.


Nó được tích hợp vào Mongoose, vì vậy hãy tránh sử dụng các plugin
Simon Dragsbæk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.