我有一个看起来像的文件:
{
"personName": "Some name",
"metaDetails": {
"visits": 1,
"otherMeta": 32
}
}
将Mongoose
用于Node.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 :(得分:2)
为什么要将$运算符放在另一个对象中。在javascript中它将成为一个关联数组,但是$ inc接受相当于它的字符串。
尝试此功能
Person.update {personName: "Some name"}, {$inc: "metaDetails.$.visits" : 1 }, {upsert: true}, (err, updRes) ->
答案 1 :(得分: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记录。简而言之,更新中的$运算符要求该字段是谓词的一部分。