3

我有一个看起来像这样的文件:

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

用于. Mongoose_ Node.js我想更新(或插入)访问次数。这是我到目前为止所拥有的。我已经阅读了$ 位置运算符,但我可能还差得很远:

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故意不定义超出数组,因为其中的数据可能是高度可变的

4

2 回答 2

2

为什么将 $ 运算符放在另一个对象中。在 javascript 中它会变成一个关联数组,但 $inc 接受它的等价字符串。

试试这个功能

Person.update {personName: "Some name"}, {$inc:  "metaDetails.$.visits" : 1 }, {upsert: true}, (err, updRes) ->
于 2011-11-17T17:03:08.750 回答
0

我不熟悉 Mongoose 语法,因为我通常直接使用本机驱动程序,但您的 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 记录。简而言之,更新中的 $ 运算符要求该字段是谓词的一部分。

于 2011-11-17T18:17:20.413 回答