3

次のようなドキュメントがあります。

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

Mongooseforを使用し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 }

upsertをtrueに設定すると、visitsキーを持つmetaDetailsオブジェクトがない場合、重複するpersonNameレコードが作成されます。簡潔に言えば、更新の$演算子では、フィールドが述語の一部である必要があります。

于 2011-11-17T18:17:20.413 に答える