2011-10-19 6 views
2

Codeigniter와 Alex Bilbie의 MongoDB 라이브러리를 사용하고 있습니다. 내 API에서 사용자를 개발 중이므로 이미지를 업로드 할 수 있고 다른 사용자는 댓글을 달 수 있습니다. 이미지에 하위 문서로 주석을 포함하도록 선택했습니다.MongoDB를 사용한 다중 원자 업데이트?

각 댓글이 포함되어 있습니다 (저자의)

  • 전체 이름
  • 코멘트
  • Created_at 즉 그래서

. 사용자의 성명은 각 댓글에 "하드 코딩"되어 있으므로 나중에 이름이 바뀌면 문제가 있습니다.

원자 적 업데이트를 사용하여 주석과 같이 이름의 모든 항목을 업데이트 할 수 있지만 Alex의 라이브러리를 사용하여 어떻게 할 수 있습니까? 이름이 잘못된 곳을 모두 업데이트 할 수 있습니까? 이미지 문서는 의견과 같은 방법

UPDATE는

이다. MongoDB가 하위 문서 사용을 권장하지만 배열에 여러 항목을 업데이트하는 방법은 포함되지 않은 것이 이상하다고 생각합니다.

{ 
    "_id": ObjectId("4e9ead773dc793dc01020000"), 
    "description": "An image", 
    "category": "accident", 
    "comments": [ 
     { 
      "id": ObjectId("4e96bd063dc7937202000000"), 
      "fullname": "James Bond", 
      "comment": "This is a comment.", 
      "created_at": "2011-10-19 13:02:40" 
     } 
    ], 
    "created_at": "2011-10-19 12:59:03" 
} 

감사합니다.

답변

1

나는 codeignitor에 익숙하지 않은,하지만 메가 MongoDB의 쉘 구문은 당신을 도울 것입니다 :

db.comments.update({"Fullname":"Andrew Orsich"}, 
        { $set : { Fullname: "New name"} }, false, true) 

마지막 진정한 플래그는 여러 문서를 업데이트 할 것을 나타냅니다. 따라서 한 번의 업데이트 작업으로 모든 주석을 업데이트 할 수 있습니다.

BTW : 일반적으로 mongodb 및 nosql의 데이터를 denormalize ('하드 코딩하지 않음')하는 것은 일반적인 작업입니다. 또한 많은 문서를 업데이트해야하는 작업은 일반적으로 비동기로 작동합니다. 그러나 그것은 당신에게 달려 있습니다.

업데이트 : 쿼리 위

db.comments.update({"comments.Fullname":"Andrew Orsich"}, 
        { $set : { comments.$.Fullname: "New name"} }, false, true) 

하지만, 중첩 된 배열에서 첫번째 코멘트에 이름을 업데이트합니다. 둘 이상의 배열 요소에 대한 변경 사항에 영향을 주려면 여러 개의 update 문을 사용해야합니다.

+0

고마워요! 내 질문을 예제로 업데이트했습니다. ID를 사용하고 해당 구조를 사용하여 코멘트에 액세스하고 변경하려면 어떻게합니까? –