簡體   English   中英

將帶有 $currentDate 的字段插入 Meteor 中的 MongoDB 集合

[英]Insert field with $currentDate to MongoDB collection in Meteor

不確定如何在將文檔插入 Meteor 中的 MongoDB 集合時使用$currentDate

這只能用於更新,不能用於插入嗎? 看起來很奇怪,但我沒有看到替代方案(除了使用new Date之外)。

例子

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

筆記/想法/ TL,DR

  • 字段不能以 $ 運算符或據我所知以大括號{}開頭。
  • 如果確實如此,擁有一個僅適用於更新的操作員有什么意義?
  • 為什么/什么時候$currentDatenew Date更好?
  • 如果使用 Moment.js esp,一件好事是 $currentDate 以 ISO 8601 格式輸入。
  • 從一開始就做某種 upsert 的答案是什么? 如果是這樣,這會產生意想不到的后果嗎?

如果確實如此,那么擁有僅適用於更新的運營商有什么意義呢?

$currentDate是一個更新操作符,因此您不能將它與collection.insert方法一起使用。 但是當upserttrue時,當沒有文檔符合查詢條件時,它將創建一個新文檔。 MongoDB運營商傾向於遵循Unix哲學

做一件事並做得好

因此每個操作員只應執行一項任務。

為什么/什么時候$currentDatenew Date更好?

首先,我想提一下, new Date是一個JavaScript Date實例。

當您想要將字段的值更新為當前日期但使用new Date時需要使用另一個更新運算符才能使用$currentDatenew Date 例如:

  • 使用new Date

     db.collection.update({ "name": "bar" }, { "$set": { "date": new Date() }}) 
  • 使用$currentDate

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

$currentDate不同, new Date可以與insert方法一起使用,如果使用多於on參數調用Date則可以將值設置為特定值。

您可以從插入操作中創建的自動生成的“_id”中檢索時間戳。

http://api.mongodb.com/java/current/org/bson/types/ObjectId.html

只需使用方法:ObjectId.getTimestamp()。

時間戳粒度以秒為單位。

如果你在集合模型中使用autoValue會變得更簡單

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

它會在插入或更新數據時自動設置日期

$ current結構中使用的$ currentDate可用於插入字段(如果它們在文檔中不存在)。

引用Mongodb 3.4的文檔:行為

If the field does not exist, $currentDate adds the field to a document.

盡管我非常欣賞這種設計的完美意義,但有一個論點,也許是一個不好的論點,即您希望在插入文檔時將updated_at字段設置為合理的值。 您可能想要這樣做的一個原因是避免總是需要查詢兩個字段來獲取最后更新時間。 就像我說的,這可能是一個糟糕的 juju,但是你 go。

無論如何,我能想出的最好的 hack 是執行一個upsert過濾而not the empty filter 這保證了upsert始終是insert

只是對 MongoDB 開發人員的一點評論。 作為一個使用數據庫多年的人,他們記不得了,讓我思考一下應該如何在 MongoDB 中正確地做時間戳:

created_at => _id.Timestamp
updated_at => $currentDate()

我花了太長時間了。 也許那是我的錯,可能是,但我認為這是大多數人可能想要/需要做的事情,作為一個概念,它可以得到更好的解釋。 如果你四處搜索,你會發現很多不好的/錯誤的信息,因為我很確定這是這樣做的方式......好吧,inte.net 還遠未就此達成共識(盡管我現在).

不知道,可能是考試吧。 也許這是你在招聘 MongoDB 開發人員時問別人的第一件事:你如何做時間戳? 好吧,無論如何我都會問這個問題,因為如果您知道到那個階段您可能已經了解了 API 的大部分內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM