mongodb如何批量修改内嵌文档的属性?
PHPz
PHPz 2017-04-25 09:02:17
0
4
785
{
  "_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    
                    }
                }
            );
        });
}

请大家指正~~

PHPz
PHPz

学习是最好的投资!

모든 응답(4)
滿天的星座

mongo 쉘에서도 변경할 수 있습니다.

Peter_Zhu

으아악

저도 비슷한 문제가 발생했습니다. 공식 문서를 확인해 보니 위와 같습니다.

迷茫

이를 수행하려면 집계 프레임워크 집계를 사용하세요. 먼저 unwind로 긴장을 풀어보세요. 그런 다음 모든 상태를 업데이트하십시오.

phpcn_u1582

이 작업은 가능합니다. mongodb는 포함된 데이터 객체 업데이트를 위해 달러 기호 "$"를 제공합니다.
결과를 원하시면 다음과 같이 작성하시면 됩니다:

으아악

그러나 업데이트 조건문에는 데이터의 개체 조건이 포함되어야 합니다. 예를 들어 위의 {"messaage.status":true}를 다른 것으로 변경할 수도 있습니다.

mongodb 문서를 참조하세요: http://docs.mongodb.org/manual/reference/operator/update/positional/#update-documents-in-an-array

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿