検索

ホームページ  >  に質問  >  本文

mongodb如何批量修改内嵌文档的属性?

{
  "_id" : ObjectId("52fb2ceb1e2f8622d4228a7a"),
  "from" : 0,
  "message" : [{
      "data" : "test1",
      "status" : true,
      "time" : 1
    }, {
      "data" : "test2",
      "status" : true,
      "time" : 2
    }],
  "to" : 1,
  "type" : "s"
}

如何用一条命令把message数组中2个对象元素中的status属性都改成false?

是否只能在客户端做逻辑处理:

var cursor =  db.msg.find({“to”: uid, “message.status”: false});
while(cursor.hasNext()){  //由于默认情况下find取得的游标已经做过快照,所以理论上不会影响在find之后新增的数据
    var doc = cursor.next();
    var from = doc.from;
    var type = doc.type;
        //循环对应文档的message数组中的所有元素,进行逐行更改
    item.message.foreach(function(msg){
         db.msg.update({
                “to”: uid,
                “from”: from,
                “type”: type,
                “message.time”: msg.time
            },
            {
                “$set”: {
                        “message.$.status”: true    
                    }
                }
            );
        });
}

请大家指正~~

PHPzPHPz2764日前786

全員に返信(4)返信します

  • 滿天的星座

    滿天的星座2017-04-25 09:04:17

    mongo シェルでも変更できます

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-25 09:04:17

    リーリー

    私も同様の問題に遭遇しました。公式ドキュメントを確認したところ、私のローカルの解決策が上記のとおりであることがわかりました。お役に立てれば幸いです

    返事
    0
  • 迷茫

    迷茫2017-04-25 09:04:17

    これを行うには、集計フレームワークの集計を使用します。まずはunwindで巻き戻します。次に、すべてのステータスを更新します。

    返事
    0
  • phpcn_u1582

    phpcn_u15822017-04-25 09:04:17

    これは可能です。mongodb は、埋め込みデータ オブジェクトを更新するためのドル記号「$」を提供します。
    結果が必要な場合は、次のステートメントを書くことができます:

    リーリー

    ただし、更新条件ステートメントにはデータ内のオブジェクトの条件が含まれている必要があることに注意してください。たとえば、上記の {"messaage.status":true} を他のものに変更することもできます。

    mongodb のドキュメントを参照してください: http://docs.mongodb.org/manual/reference/operator/update/positional/#update-documents-in-an-array

    返事
    0
  • キャンセル返事