2011-11-17 107 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记录。简而言之,更新中的$操作符要求该字段是谓词的一部分。

相关问题