これは期待どおりに機能しています:
> db.test.insert({"a":1, "b": [{"v":1, "b":1}]})
> db.test.find()
{ "_id" : ObjectId("5102c75c8e48734ea1220a9c"), "a" : 1, "b" : [ { "v" : 1, "b" : 1 } ] }
> db.test.update({"_id" : ObjectId("5102c75c8e48734ea1220a9c")}, {$set: {"b": [{"v":1}]}})
> db.test.find()
{ "_id" : ObjectId("5102c75c8e48734ea1220a9c"), "a" : 1, "b" : [ { "v" : 1 } ] }
JSが配列を解釈する方法だったのではないかと思いましたが、そうではありません。私にとってはうまく機能します。
実行しているクエリを見せてもらえますか? たぶん、完全なスクリプトでこの動作を再現できますか?
編集
あなたのデータが異なっていることに気付いたので、以下に正確に複製しました。
> db.test.insert({"a":1, "b": [{'f':'v'}]})
> db.test.find()
{ "_id" : ObjectId("5102c8868e48734ea1220a9d"), "a" : 1, "b" : [ { "f" : "v" } ] }
> db.test.update({ "_id" : ObjectId("5102c8868e48734ea1220a9d")}, {$set: {"b": [{"f":"b"}]}})
> db.test.find()
{ "_id" : ObjectId("5102c8868e48734ea1220a9d"), "a" : 1, "b" : [ { "f" : "b" } ] }