2012-04-23 2 views
2

MongoDB를 사용하기 위해 PHP로 간단한 블로그 시스템을 만들려고 노력하고 있습니다.하지만 Mongo를 쿼리하는 데 어려움이 있습니다.MongoDB : 중첩 된 배열을 쿼리하는 방법?

각 블로그 게시물 문서는 다음과 같습니다 어디 2000 무작위 게시물을 생성했습니다

예를 들어 하나 개의 특정 저자가 쓴 모든 글을 가져올 때 나는 거의 그 많은 혜택 질의에 보류를 얻고있다
{ 
    "_id": ObjectId("4f908868d3269edc1a00044c"), 
    "author": { 
    "name": "Christine Skinner", 
    "email": "[email protected]", 
    "age": 54, 
    "city": "London" 
    }, 
    "post": "sagittis. Nullam vitae diam. Proin dolor. Nulla semper tellus id nunc interdum feugiat. Sed nec metus facilisis lorem tristique aliquet. Phasellus fer [...]", 
    "date": "Fri Nov 13 12: 11: 48 +0100 2009", 
    "rating": 2, 
    "comments": { 
    "0": { 
     "name": "Barrett Bailey", 
     "email": "[email protected]", 
     "upVotes": 4, 
     "downVotes": 76, 
     "comment": "gravida. Aliquam tincidunt, nunc ac mattis ornare, lectus ante dictum mi, ac mattis velit justo nec ante. Maecenas mi felis, adipiscing fringilla, por [...]" 
    }, 
    "1": { 
     "name": "Cheryl Fitzgerald", 
     "email": "[email protected]", 
     "upVotes": 13, 
     "downVotes": 76, 
     "comment": "adipiscing. Mauris molestie pharetra nibh. Aliquam ornare, libero at auctor mauris id sapien. Cras dolor dolor, tempus non, lacinia at, iaculis quis, [...]" 
    }, 
    "2": { 
     "name": "Carly Graham", 
     "email": "[email protected]", 
     "upVotes": 55, 
     "downVotes": 75, 
     "comment": "Nullam velit dui, semper et, lacinia vitae, massa lobortis ultrices. Vivamus rhoncus. Donec est. Nunc ullamcorper, velit in aliquet lobortis, nisi nib [...]" 
    } 
    }, 
    "tags": { 
    "0": "World War II", 
    "1": "world War I" 
    } 
} 

또는 등급이 X보다 크거나 같은 게시물을 받고 있지만 내 의견이 중첩 된 배열에 문제가 있습니다.

내가 잘못했는지는 잘 모르겠지만 먼저 모든 블로그 게시물에 댓글을 달아 어떻게 표시합니까? $collection->find() 간단한 작업을 수행 할 때 PHP 함수 iterator_to_array를 사용하여 배열에서 모두 가져옵니다. 그런 다음 각 값을 반복하는 간단한 foreach()를 수행합니다. 그러나 주석은 그 자체로 배열입니다. 의견을 얻기 위해 새로운 foreach를 만들어야합니까, 아니면 더 빠르고 더 똑똑한 방법이 있습니까?

또 다른 문제점은 쿼리의 주석 속성을 사용하려는 경우입니다. 댓글을 삭제해야하는 경우 _id와 댓글 작성자 (또는 댓글 번호)를 블로그에 게시해야하지만 댓글 수가 다양하기 때문에 때로는 댓글이 하나 뿐이고 때로는 최대 10 개의 댓글까지 있습니다.

의견을 다른 컬렉션에 넣어야합니까, 아니면 각 코멘트에 배열 번호가 아닌 고유 한 ID를 주어도됩니까? 그리고 질문에 대한 주석 내부의 속성을 사용하여 어떻게 하나의 블로그 게시물을 표시하지만 가장 큰 upVotes 이후에 주석을 정렬하려고한다고 가정 해 봅시다.

여러 자습서를 시도했지만 그 중 대부분이 매우 정적 인 문서를 다루고 있으므로이 방법이 잘못되었다고 생각됩니다.

도움이나 제안을 보내 주시면 대단히 감사하겠습니다.

답변

4

첫째, 당신은 뭔가를 할 수 있습니다 그래서 또 다른 루프는 : 당신이 문서의 개별 의견을 업데이트하려면

foreach ($cursor as $post){ 
    foreach($post['comments'] as $num=>$comment){ 
     echo "Comment number " 
      .$num 
      ." was written by " 
      .$comment['name'] 
      .": " 
      .$comment['comment']; 
    } 
} 

, 당신은 다음과 같이 그 작업을 수행 할 수 있습니다

$collection->update(
     array('_id'=>new MongoId($id)), 
     array('$set'=>array('comments.'.$num.'.comment'=>$newComment)) 
); 

쿼리 내에서 주석 하위 문서를 정렬 할 수 없으므로 반환 된 각 게시물에 대해 쿼리 한 후에 PHP 내에서 정렬해야합니다.여러분이 필요로하는 PHP 매뉴얼에서 usort를보세요 : http://www.php.net/manual/en/function.usort.php.

0

실제로 문서에 따르면 배열이 아닌 하위 문서 (개체)에 주석을 저장하고 있습니다. 따라서 기본적으로 각 댓글에는 고유 한 ID (이 경우 0-2)가 있습니다. 특정 댓글을 삭제 원한다면는 콘솔에 다음과 같이 간단 할 것이다 :

db.collection.update({"_id": ObjectId("4f908868d3269edc1a00044c")}, {$unset: {"comments.1": 1}}); 

또는 PHP에서 :

$collection->update(array("$unset" => array("comments.1" => 1))); 

를 귀하의 의견 반복에 관해서는, 당신은 바로이있다. 기본적으로 반환 된 문서의 주석 요소를 foreach해야합니다. 당신이 모든 의견을 표시하려는 경우 당신이 필요로하는, 예, 둘째

$collection->find(array('author.name'=>'Christine Skinner')); 

: 당신이 모든 의견 블로그 포스트를 얻으려면

관련 문제