2013-07-08 3 views
0

안녕 사용자 모음의 MongoDB의 문서를 데에 새로 추가 된 요소 얻을 : 내가받은 편지함 5 분마다 확인해야 할 요구 사항에 따라배열의 길이를 계산하고 MongoDB를 + PHP가

{ 
    "_id": ObjectId("51d9534fc469880b338903eb"), 
    "inbox": { 
     "0": {}, 
     "1": {} , 
     "2": {} 
      ... 
    }, 

} 

합니다. 그래서 내가 찾고 :

  1. 받은 편지함의 길이를 찾으려면.
  2. 내받은 편지함 길이는 4이지만 2 개의 새 메시지가 들어 왔다고 가정 해 봅시다. 새 메시지 만받는 방법은 무엇입니까?

약간의 연구를 거친 후에 db.collection.find({ tags : { $size: 4 }});을 사용하여받은 편지함에 새 메시지가 있는지 확인할 수 있지만 이제는 새로 추가 한 메시지를 어떻게 찾을 수 있습니까? 이 상황을 극복하는 더 좋은 방법을 제안 할 수 있다면 정말 좋을 것입니다.

감사합니다.

답변

0

당신은 당신의 배열의 일부 항목을 건너 뛰도록 $slice 연산자를 사용한다 :

db.collection.find({ tags : { $size : 4 } }, { inbox : { $slice : -4 } }) 

확인 귀하의 예제에 문서이기 때문에 당신의 inbox 필드, 정말 배열 인 경우.

var len = current_length; // comes from your app 
var field = 'inbox.' + len; 
// the query will check if the index "len" of inbox array exists 
db.collection.find({ field : { $exists: true }, { inbox : { $slice : -len } }} 

확인 인덱스 쿼리에 대한 자세한 내용은이 질문 : https://stackoverflow.com/a/15224544/1877296

0

아마도 당신이 될 것입니다 새 메시지를 가져,받은 편지함의 길이를 가지고있는 가정도 쿼리를 수정해야

먼저 스키마를 디자인하는 가장 좋은 방법은 inbox에 개체를 사용하지 않는 것입니다. 배열을 사용해야합니다.

둘째, 새 메시지 란 무엇입니까 (4 개의 메시지 중 2 개의 메시지가 새로운 메시지)? 나는 true 또는 false 중 하나 일 수있는 read 필드가 있다는 사지에 있습니다.

실제로 무엇을하고 있는지 묻는 것은 모든 메시지를 보내는 날짜별로 정렬하는 방법입니다. 여기서 readfalse입니다. 또는 MongoDate (http://php.net/manual/en/class.mongodate.php) lastPullTime을 사용하여 $_SESSION에 값을 저장하는 것을 추적 할 수 있습니다.

이 예에서는 read 필드를 사용합니다. sent이라는 ISODate() 형식의 보낸 날짜가 있다고 가정합니다.

이를 위해 우리는과 같이 집계 프레임 워크를 사용할 수 있습니다

db.collection.aggregate([ 
    // Let's get our user 
    {$match:{_id:ObjectId()}}, 

    // Now we want to unwind the inbox so we can operate on it 
    {$unwind:'$inbox'}, 

    // Now we want only messages that are not read 
    {$match: {'inbox.read':false}}, 

    // Now lets do our sort by newest 
    {$sort: {'inbox.sent':-1}}, 

    // Now lets group them back up 
    {$group: {_id:'$_id', inbox: {$addToSet:'$inbox'}}} 
]) 

또는 당신은에 asort와 PHP에서 그것을 할 수 $doc['inbox']

관련 문제