![](/img/trans.png)
[英]Updating/upsert/insert to a nested collection in 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
{}
開頭。$currentDate
比new Date
更好?如果確實如此,那么擁有僅適用於更新的運營商有什么意義呢?
$currentDate
是一個更新操作符,因此您不能將它與collection.insert
方法一起使用。 但是當upsert
為true
時,當沒有文檔符合查詢條件時,它將創建一個新文檔。 MongoDB運營商傾向於遵循Unix哲學
做一件事並做得好
因此每個操作員只應執行一項任務。
為什么/什么時候
$currentDate
比new Date
更好?
首先,我想提一下, new Date
是一個JavaScript Date實例。
當您想要將字段的值更新為當前日期但使用new Date
時需要使用另一個更新運算符才能使用$currentDate
和new 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.