2013-12-16 5 views
0
 

    db.sort.drop(); 
    db.sort.insert({stats: [{userId: 1, date: '01012013'},{userId: 2, date: '31122012'}]}); 
    db.sort.insert({stats: [{userId: 1, date: '31122013'},{userId: 2, date: '01012012'}]}); 

    > db.sort.find({'stats.userId': 1}).sort({'stats.date': 1}).pretty() 
    { 
      "_id" : ObjectId("52af1ce974be7dbd071e8563"), 
      "stats" : [ 
        { 
          "userId" : 1, 
          "date" : "31122013" 
        }, 
        { 
          "userId" : 2, 
          "date" : "01012012" 
        } 
      ] 
    } 
    { 
      "_id" : ObjectId("52af1ce974be7dbd071e8562"), 
      "stats" : [ 
        { 
          "userId" : 1, 
          "date" : "01012013" 
        }, 
        { 
          "userId" : 2, 
          "date" : "31122012" 
        } 
      ] 
    } 

날짜별로 정렬 된 문서를 얻는 방법 userId : 1? 의 라인을 따라중첩 된 개체를 정렬하는 방법

 

    { 
      "_id" : ObjectId("52af1ce974be7dbd071e8562"), 
      "stats" : [ 
        { 
          "userId" : 1, 
          "date" : "01012013" 
        }, 
        { 
          "userId" : 2, 
          "date" : "31122012" 
        } 
      ] 
    } 

    { 
      "_id" : ObjectId("52af1ce974be7dbd071e8563"), 
      "stats" : [ 
        { 
          "userId" : 1, 
          "date" : "31122013" 
        }, 
        { 
          "userId" : 2, 
          "date" : "01012012" 
        } 
      ] 
    } 

+1

WHAT * 출력 * 예상 하시겠습니까? – Alex

+0

날짜별로 정렬하는 경우 문서는 01012012의 날짜가 처음 인 문서가되지만 필요에 따라 날짜가 01012013 인 문서가 특정 사용자별로 정렬 될 것으로 예상됩니다 –

+0

편집 된 답변, 예상 결과가 나타납니다 – Alex

답변

2

뭔가 : 위의 데이터를 감안할 때

db.COLLECTION.find({stats.userID: 1}).sort({'stats.date':1}) 

을, 나는 그 쿼리를 실행할 때, 나는이 돌아 오기 :

"stats" : [ 
    { 
     "userId" : 1, 
     "date" : 1012013 
    } 
+0

코멘트 주셔서 감사합니다. 그러나이 경우 모든 날짜를 정렬하지만 userId 날짜순으로 정렬해야합니다. –

+0

UserId가 문서를 찾은 다음 정렬합니다 ...? 문제가 어디 있니? – Alex

+0

문서를 업데이트했습니다. 날짜별로 정렬하면 모든 날짜가 정렬되기 때문에 첫 번째 문서가 두 번째 자리에 있습니다. –

0


내가 볼 것으로 예상 달성하기 위해 집계 프레임 워크를 사용할 수 있습니다

db.sort.aggregate(
[ 
     {$unwind:"$stats"}, 
     {$match:{"stats.userId":1}}, 
     {$sort:{"stats.date":1}} 
]); 
확인 1 :

당신은 그것의 값으로 날짜 필드 이름과 사용자 + ID 조합을 저장하는 스키마를 변경할 수 있다면는 쉽게

> db.so2.find().pretty() 
{ 
     "_id" : 1, 
     "stats" : [ 
       { 
         "userId1" : "01012013" 
       }, 
       { 
         "userId2" : "31122012" 
       } 
     ] 
} 
{ 
     "_id" : 2, 
     "stats" : [ 
       { 
         "userId1" : "31122013" 
       }, 
       { 
         "userId2" : "01012012" 
       } 
     ] 
} 

당신은 다음 userId를에서 쿼리 조건을 변경이를 달성 userId 필드의 존재에 대해

> db.so2.find({"stats.userId1":{$exists:1}}).sort({"stats.userId1":1}).pretty() 
{ 
     "_id" : 1, 
     "stats" : [ 
       { 
         "userId1" : "01012013" 
       }, 
       { 
         "userId2" : "31122012" 
       } 
     ] 
} 
{ 
     "_id" : 2, 
     "stats" : [ 
       { 
         "userId1" : "31122013" 
       }, 
       { 
         "userId2" : "01012012" 
       } 
     ] 
} 
+0

의견을 보내 주셔서 감사합니다! 그러나이 경우 인덱스를 구성 할 수 없습니다. –

+0

대체 스키마를 사용하는 경우 stats.userId1을 인덱싱 할 수 있습니다 –

관련 문제