Возможно ли обновить поддоку через Mongoose с помощью $inc?

У меня есть документ, который выглядит так:

{
 "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) ->

Однако это не означает, что оно действительно обновляет или вставляет какие-либо документы. Любая помощь?

EDIT: добавлена ​​модель

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

Это моя модель. metaDetails намеренно не определяется за пределами только массива, потому что данные внутри могут быть сильно переменными

2 ответа

Почему вы помещаете оператор $внутри другого объекта. В javascript он становится ассоциативным массивом, но $inc принимает его эквивалент.

Попробуйте эту функцию

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


Я не знаком с синтаксисом 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 }

Настройка upsert на true создаст дублируемую запись personName, если нет объекта metaDetails с ключом визитов. Короче говоря, оператор $в обновлении требует, чтобы поле было частью предиката.

licensed under cc by-sa 3.0 with attribution.