2015-05-13 15 views
11

Không chắc chắn cách sử dụng $currentDate khi chèn tài liệu vào bộ sưu tập MongoDB trong Meteor.

Chỉ có thể sử dụng tính năng này trong bản cập nhật chứ không phải bản chèn? Có vẻ lạ, nhưng tôi không thấy thay thế (thay vì sử dụng new Date thay thế).

Ví dụ

Stuff.insert({ 
    owner: Meteor.userId(), 
    createdAt: ..., // how to create this field with $currentDate ? 
    theStuff: "Some of the good stuff" 
}) 

Notes/Suy nghĩ/TL, DR

  • Fields có thể không bắt đầu với $ khai thác hoặc, như xa như tôi biết, dấu ngoặc nhọn {}.
  • Điểm của việc có một nhà điều hành chỉ hoạt động với các bản cập nhật, nếu đó thực sự là trường hợp?
  • Tại sao/khi nào là $currentDate tốt hơn new Date?
  • Một điều tốt đẹp, nếu sử dụng Moment.js esp, là $ currentDate được nhập theo định dạng ISO 8601.
  • Câu trả lời là làm một số loại thăng trầm ngay từ đầu? Nếu vậy, điều này có thể có hậu quả ngoài ý muốn không?

Trả lời

15

Điểm của một nhà điều hành chỉ hoạt động với các bản cập nhật là gì?

$currentDateupdate operator vì vậy bạn không thể sử dụng phương pháp collection.insert. Nhưng khi upserttrue, nó sẽ tạo một tài liệu mới khi không có tài liệu nào phù hợp với tiêu chí truy vấn. khai thác MongoDB có xu hướng làm theo các Unix philosophy

làm một việc và Do It Well

Vì vậy, mỗi nhà khai thác nên thực hiện chỉ có một nhiệm vụ.

Tại sao/khi nào là $currentDate tốt hơn new Date?

Trước tiên, tôi muốn đề cập rằng new DateJavaScript Ví dụ ngày.

$currentDatenew Date có thể được sử dụng khi bạn muốn cập nhật giá trị của một lĩnh vực cho đến nay hiện tại nhưng với new Date bạn cần phải sử dụng update operator khác cho nó để làm việc.Ví dụ:

  • Sử dụng new Date

    db.collection.update({ "name": "bar" }, { "$set": { "date": new Date() }}) 
    
  • Sử dụng $currentDate

    db.collection.update({ "name": "bar"}, 
        { "$currentDate": { "date": { "$type": date }}} 
    ) 
    

Không giống như $currentDate, new Date có thể sử dụng với các insert phương thức và giá trị có thể được thiết lập để một cụ thể nếu Date là cuộc gọi với nhiều hơn về đối số.

+0

Really nice, cảm ơn bạn. –

+2

. Nếu bạn có một ứng dụng phân tán kết nối với cụm sao chép/phân đoạn của bạn chèn nhiều tài liệu mỗi giây, bạn muốn trường createdAt nhất quán và sử dụng $ currentDate trên Insert sẽ là một giải pháp tốt hơn. Nếu bạn không có khối lượng chèn cao, chèn và chèn có thể giống nhau cho bạn nhưng thực tế là không. Upsert là chậm hơn và khi bạn sử dụng ** ngày mới ** bạn đang nhận được ngày từ máy khách không phải từ máy chủ cơ sở dữ liệu, do đó bạn dễ bị mâu thuẫn khi nói đến phân loại bởi createdAt. –

+0

@MestreSan '$ currentDate' chỉ hoạt động với' updateOne' hoặc 'updateMany'. Không phải với 'chèn'. Có lẽ bạn có nghĩa là * cập nhật * khi bạn nói * chèn * trong bình luận. – styvane

0

Nó sẽ trở nên đơn giản hơn nếu bạn sẽ sử dụng autoValue trong mô hình thu

createdAt: 
type: Date 
autoValue: -> 
    if this.isInsert 
    return new Date 
    else if this.isUpsert 
    return $setOnInsert: new Date 
    else 
    this.unset() 

Nó sẽ tự động thiết lập ngày trong khi chèn hoặc cập nhật dữ liệu vào nó câu trả lời

Các vấn đề liên quan