Можно ли обновить вложенный документ через Mongoose, используя $ inc? - PullRequest
3 голосов
/ 17 ноября 2011

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

{
    "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 намеренно не определен за пределами массива, потому что данные внутри могут быть очень переменными

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

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

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

Person.update {personName: "Some name"}, {$inc:  "metaDetails.$.visits" : 1 }, {upsert: true}, (err, updRes) ->
0 голосов
/ 17 ноября 2011

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

Если установить для параметра true значение true, будет создана дублирующаяся запись personName, если отсутствует объект metaDetails с ключом посещений. Вкратце, оператор $ в обновлении требует, чтобы поле было частью предиката.

...