2013-07-22 2 views
0

내 문서 중 하나에 고정 크기 배열을 저장하고 싶습니다.시간순으로 정렬 된 고정 크기 배열 (가장 새로운 것부터)

I.E. 사용자 컬렉션에는 일련의 보고서가 있습니다. 각 보고서에는 시간 소인이 있습니다. 최신 (최신) 배열의 시작 부분에 있도록 배열에서 보고서를 정렬 할 싶습니다.

$ slice 메서드를 사용하려고하지만 배열의 마지막 N 요소 만 유지할 수있는 것처럼 보입니다. 제 경우에는 배열의 첫 번째 N 요소를 유지하려고합니다.

어떻게 든 배열을 최신 시간순으로 정렬하고 N 개의 최신 보고서 만 저장할 수있는 방법이 있습니까? 그런 식으로 N 최신 보고서를 쿼리 할 때 배열의 시작 부분부터 잡을 수 있습니다.

var newReport = ...; 
    db.users.update({{_id: id},$push: {reports: {$each: [newReport], $sort: {"updatedOn": -1}, $slice: -3}}}) 

가장 오래된 것부터 가장 오래된 것으로 정렬되지만 슬라이스가 음수이므로 3 개의 가장 오래된 리포트가 배열에 보관됩니다. 일종의 오래된 최신, 그리고 3 개 최신 보고서를 보고서 목록으로 유지됩니다 것

var newReport = ...; 
    db.users.update({{_id: id},$push: {reports: {$each: [newReport], $sort: {"updatedOn": 1}, $slice: -3}}}) 

은이다 최신에 오래된를 주문하십시오.

내가 잘못 했나요?

+0

클라이언트 측에서 db와 scan-from-end에 가장 오래된 것을 최신으로 저장할 수없는 이유가 있습니까? 그것은보다 자연스러운 해결책처럼 보입니다. – Amalia

답변

1

두 번째 쿼리는 주로 찾고있는 것입니다. Amalia는 애플리케이션 코드에서 올바른 배열 순서를 얻는 것이 더 쉽다는 것에 동의합니다.

그러나 두 번째 쿼리의 구문에는 몇 가지 문제가 있습니다. 당신이이 일을해야

db.users.update({_id: id}, {$push: {reports: {$each: [newReport], $sort: {"updatedOn: 1}, $slice: -3}}}) 

에 쿼리를 변경하면

db.users.update({<query, <update>}) 

을하고있는 지금

db.users.update({<query>}, {<update>}) 

: 업데이트 쿼리는이 패턴을 따릅니다.

관련 문제