我試圖使用Node.js(使用本地MongoDB驅動程序)在MongoDB中設置和更新某些加蓋的集合。 我的目標是,在運行app.js時,將文檔插入到加蓋集合中,並更新封頂集合中的現有文檔。這兩個都在setInterval()
上運行,所以每隔幾秒鐘。mongodb - 使用nodejs加蓋的集合
我的問題:
- 我想創建一個集合,如果集合不存在,但如果這樣做我想將文檔插入它來代替。什麼是檢查這個的正確方法?
- 帶上限的集合,我應該甚至在插入任何內容之前先明確地創建它們?通常我相信你可以插入一些東西到一個集合中而不用明確地創建它們,但在這種情況下,我需要確保它們被封閉。一旦封頂的集合存在,我知道如何插入新的文檔,問題是我需要某種方式來處理第一次使用的應用程序(在一個新的服務器上),集合尚不存在,我想使用節點來做這個創建,而不必跳進mongo cli。
- 這裏的訣竅是收藏需要封頂,所以我可以做類似於:
db.createCollection("collectionName", { capped : true, size : 100000, max : 5000 })
。這將爲我創建封頂集合,但每次我打電話時它都會調用createCollection()
而不是更新或插入 - 如果我調用createCollection()
,一旦集合已經存在,是否會完全覆蓋現有集合? - 另一種方法是將集合變爲帶上限的集合:
db.runCommand({"convertToCapped": "collectionName", size: 100000, max : 5000 });
。問題在於節點不會將runCommand()
看作是有效的函數,並且是錯誤的。有沒有其他的東西,我打算叫這個工作?它在mongo cli中工作,但不在節點內 - 您使用什麼類型的查詢來查找集合中的第一個文檔?再次,在mongo cli中,我可以使用
db.collections.find()
進行某些查詢,但在節點內指出find()
不是有效函數 - 如何使用
collection.update()
將一些新字段添加到現有文檔?可以說文檔是一些簡單的對象,如{key1: "value", key2: "value"}
,但我有一個包含{key3: "value"}
的對象。關鍵3在當前文檔中不存在,我如何將它添加到當前存在的?這與上面#4有些相關,因爲我不確定傳入find()
似乎不能很好地與節點一起查詢參數。
謝謝。我在這裏嘗試了一些想法,迄今爲止他們都一直在努力。關於文檔更新:我真的想要更新集合中的第一個文檔。因此,您對{「foo」:1}的查詢,我該如何替換,以便查詢返回第一個文檔? – Simon 2015-02-24 03:19:07
我有什麼似乎是一個奇怪的問題:我有一個對象,看起來像'dataObject = {「timeCollected」:3432547,「publicIP」:{「ip」:「xx.xxx.xx.xx」} (......加上其他許多人)}'。然後我從那裏抽取一些值到一個新對象中:'systemInfo = {「timeCollected」:dataObject.timeCollected,「publicIP」:dataObject.publicIP.ip,}'。我想更新我現有文檔中的timeCollected和publicIP字段(最初,這兩個字段在文檔中都設置爲0)。 – Simon 2015-02-24 03:59:06
我使用類似'collection.update(query,{「$ set」:systemInfo},function(err,result){}',但這兩個字段都沒有更新。奇怪的是,如果我只嘗試更新timeCollected,很好,但試圖更新兩者都不行,也不會自行更新publicIP – Simon 2015-02-24 03:59:36