2011-11-17 108 views
3

我有一個文件,看起來像:

{ 
    "personName": "Some name", 
    "metaDetails": { 
     "visits": 1, 
     "otherMeta": 32 
    } 
} 

使用MongooseNode.js。我想更新(或插入)訪問次數。這是迄今爲止我所擁有的。我讀過有關$ positional operator但我可能是遙遠:

updObj = {} 
newKeyString = "metaDetails.$.visits" 
updObj[newKeyString] = 1 


Person.update {personName: "Some name}, {$inc: updObj}, {upsert: true}, (err, updRes) -> 

這似乎並沒有實際更新或插入但任何文件。任何幫助?

編輯:添加模型

mongoose = require 'mongoose' 

PersonSchema = new mongoose.Schema 
    personName: 
    type: String, index: true, unique: true 
    metaDetails: [] 

這是我的模型。 metaDetails故意沒有定義超出一個陣列,因爲內部的數據可以是高度可變的

+0

這對我來說很合適。我會在最後檢查它,看看有什麼問題。 – Clint

回答

2

爲什麼你把$操作符放在另一個對象中。在JavaScript中它將成爲一個關聯數組,但$ inc接受它的字符串等價物。

試試這個功能

Person.update {personName: "Some name"}, {$inc: "metaDetails.$.visits" : 1 }, {upsert: true}, (err, updRes) -> 
+0

這不起作用,因爲我沒有指定「訪問」。看到我上面的編輯 – Shamoon

+0

@Shamoon,我們只能根據你在問題中提到的內容來回答..我怎麼知道你在其他地方犯了一個錯誤..只是在添加訪問後想知道你的初始查詢工作正常嗎? – RameshVel

+0

我的錯誤。我無法添加「訪問」。這就是問題所在,因爲我的'metaDetails'是超級變量,可以......任何東西 – Shamoon

0

我不熟悉的貓鼬的語法,我一般直接使用本地驅動程序,但你的JS更新應該是這樣的:

db.Person.update({"personName": "Some name", "metaDetails.visits": {$exists: true}}, {"$inc": {"metaDetails.$.visits": 1}})

這可能是類似的,我不確定(感覺像是缺少括號):

Person.update {personName: "Some name", $exists: "metaDetails.visits": true}, {$inc: "metaDetails.$.visits" : 1 }

如果沒有帶有訪問鍵的metaDetails對象,將upsert設置爲true會創建一個重複的personName記錄。簡而言之,更新中的$操作符要求該字段是謂詞的一部分。

相關問題