1

これは私の MongoDB クエリです。

db.events.update({date:{$gte: ISODate("2014-09-01T00:00:00Z")}},{$set:{"artists.$.soundcloud_toggle":false}},{multi:true,upsert:false})

どうやら、「artists.$.soundcloud_toggle」を使用して、artists 配列内のすべてのアーティスト ドキュメントを更新することはできません。

「$ 演算子は、$elemMatch() 演算子で指定された複数のクエリ条件に一致する最初の配列要素を更新できます。http: //docs.mongodb.org/manual/reference/operator/update/positional/

クエリに一致するすべてのイベントですべてのアーティストの soundcloud_toggle プロパティを設定するために、配列のインデックスを変更してクエリを何度も実行できてうれしいです。

artists.0.soundcloud_toggle
artists.1.soundcloud_toggle
artists.2.soundcloud_toggle
artists.3.soundcloud_toggle

問題は、たとえば、アーティスト配列にアーティスト ドキュメントが 1 つしかない場合、"artists.1.soundcloud_toggle" でクエリを実行すると、単一のプロパティを持つアーティスト ドキュメントがアーティスト配列に挿入されます。

{
   "soundcloud_toggle" : true
},

(私は "upsert:false" を宣言しましたが、これはデフォルトで false になっているはずです)

既存のドキュメントがない場合に、クエリがドキュメントを挿入して soundcloud_toggle:false を設定しないようにするにはどうすればよいですか? 指定されたアーティスト配列インデックスにアーティストが存在する場合にのみ、プロパティを更新したいと考えています。

4

1 に答える 1

0

あなたが言ったように、複数のクエリで操作を完了しても構わない場合は$exists、フィルターに条件を追加できます。

たとえば、5 回目の繰り返しで index=4 を更新する場合は、次"artists.4": {$exists: true}のように:を追加します。

db.events.update(
    { date: {$gte: ISODate("2014-09-01T00:00:00Z")},
      "artists.4": {$exists: true} },
    { $set:{ "artists.4.soundcloud_toggle" :false } },
    { multi: true, upsert: false }
)
于 2014-09-12T21:00:04.890 に答える