-1

サブドキュメントを更新するために Mongoose で作成されたコードが機能しませんでした。そこで、Mongo Shell 内でサブドキュメントを更新しようとしました。
これはドキュメント (場所) とサブドキュメント (レビュー) です。

{
"_id" : ObjectId("56d8c73314fbc7e702cfb8c4"),
"name" : "Costly",
"address" : "150, Super Street",
"coords" : [
    -0.9630884,
    51.451041
],
"reviews" : [
    {
        "author" : "kyle riggen1",
        "_id" : ObjectId("56d8de74cc7f953efd8455d9"),
        "rating" : 4,
        "timestamp" : ISODate("2015-06-01T06:00:00Z"),
        "reviewText" : "will the ID work?"
    }
],
"rating" : 0,
"__v" : 2

}

サブドキュメントを更新する私の試みのいくつかを次に示します。
この質問は次の形式を与えました。

update({ 
       _id: "56d8c73314fbc7e702cfb8c4", 
       "reviews._id": ObjectId("56d8de74cc7f953efd8455d9")
   },{
       $set: {"reviews.$.rating": 1}
   }, false, true
);

これにより、次のように「更新が定義されていません」というエラーが返されました。

2016-03-03T22:52:44.445-0700 E QUERY    [thread1] ReferenceError: update is not defined :
@(shell):1:1

コマンドが db.locations.update() で始まらなかったためだと思います

MongoDB のドキュメントでは、次の形式を使用しました。

db.locations.update(
   {
     _id: "56d8c73314fbc7e702cfb8c4",
     review: { $elemMatch: { author: "kyle riggen1" } }
   },
   { $set: { "location.$.rating" : 1 } }
)

これは有効な更新を返しますが、示されているように更新は実際には行われませんでした:

WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

この質問では、次の形式を使用しました。

db.locations.update({
    _id: "56d8c73314fbc7e702cfb8c4",
    'review.author': 'kyle riggen1'
  },
  { $set: { 'review.$.rating': 1 }}
)

これは、次に示すように、MongoDB ドキュメントと同じものを返します。

WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

したがって、これらのクエリは機能していると思いますが、データが更新されていません。私のデータはおそらく間違ってインデックス付けされますか? 実際の場所は、Mongoose API でも更新できます。

4

2 に答える 2

0

$push または $addToSet で実行できます。

db.col.update(
        { name: 'reviews', 'list.id': 2 }, 
        {$push: {'list.$.items': {id: 5, name: 'item5'}}}
    )

mongodbマニュアルからの参照を参照してください

https://docs.mongodb.org/manual/reference/operator/update/push/

于 2016-03-04T09:35:59.960 に答える
-1

知っておいてくださいdb.collection.update( criteria, objNew, upsert, multi )

  1. criteria: 一致条件
  2. objNew: コンテンツの更新
  3. upsert: 正しいか間違っているか
    • true : 存在しない場合は挿入します
    • false : 存在しない場合は挿入しない
  4. multi: 正しいか間違っているか
    • true : 一致したすべてのドキュメントを更新します
    • false : 最初に一致したドキュメントのみを更新します
于 2016-10-25T07:37:27.550 に答える