mongodb에서 마지막 N 레코드를 얻는 방법?
문서화 된 곳을 찾을 수 없습니다. 기본적으로 find () 작업은 처음부터 레코드를 가져옵니다. mongodb에서 마지막 N 레코드를 어떻게 얻을 수 있습니까?
편집 : 또한 반환 된 결과가 최신이 아닌 최신순으로 정렬되기를 원합니다.
질문을 이해하면 오름차순으로 정렬해야합니다.
"x"라는 ID 또는 날짜 필드가 있다고 가정하면 ...
.종류()
db.foo.find().sort({x:1});
1 오름차순으로 정렬 (오래된 최신까지) 것이다 -1 내림차순 정렬한다 (최신 가장한다.)
자동 생성 된 _id 필드 를 사용하는 경우 날짜가 포함되어 있으므로이를 사용하여 주문할 수 있습니다.
db.foo.find().sort({_id:1});
그러면 모든 문서가 가장 오래된 것부터 가장 오래된 것으로 되돌아갑니다.
자연 질서
위에서 언급 한 자연 질서를 사용할 수도 있습니다 ...
db.foo.find().sort({$natural:1});
다시, 원하는 순서에 따라 1 또는 -1을 사용하십시오 .
.limit () 사용
마지막으로 이런 종류의 열린 쿼리를 수행 할 때 제한을 추가하여 다음 중 하나를 수행하는 것이 좋습니다.
db.foo.find().sort({_id:1}).limit(50);
또는
db.foo.find().sort({$natural:1}).limit(50);
최근부터 최근까지 추가 된 마지막 N 개의 레코드는이 쿼리에서 볼 수 있습니다.
db.collection.find().skip(db.collection.count() - N)
역순으로 원하는 경우 :
db.collection.find().sort({ $natural: -1 }).limit(N)
Mongo-Hacker 를 설치하면 다음 을 사용할 수도 있습니다.
db.collection.find().reverse().limit(N)
이러한 명령을 작성하는 데 항상 지치면 ~ / .mongorc.js에서 사용자 정의 함수를 작성할 수 있습니다. 예 :
function last(N) {
return db.collection.find().skip(db.collection.count() - N);
}
그런 다음 mongo shell에서 다음을 입력하십시오. last(N)
마지막 N 레코드를 얻으려면 아래 쿼리를 실행할 수 있습니다.
db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)
마지막 레코드를 하나만 원하는 경우 :
db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})
참고 : $ natural 대신 컬렉션의 열 중 하나를 사용할 수 있습니다.
, 을 사용 하여 건너 뛴 값에서 마지막 N 레코드 시작을 가져올 수 있습니다 sort()
.limit()
skip()
db.collections.find().sort(key:value).limit(int value).skip(some int value);
커서 메소드 http://www.mongodb.org/display 에서 조회 : 정렬 및 자연 순서, http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order 및 sort ()를 참조하십시오. / DOCS / 고급 + 질문
컬렉션의 크기에 따라 "건너 뛰기"할 수 없습니다. 쿼리 조건을 고려하지 않기 때문입니다.
올바른 해결책은 원하는 엔드 포인트에서 정렬하고 결과 집합의 크기를 제한 한 다음 필요한 경우 결과 순서를 조정하는 것입니다.
실제 코드를 기반으로 한 예입니다.
var query = collection.find( { conditions } ).sort({$natural : -1}).limit(N);
query.exec(function(err, results) {
if (err) {
}
else if (results.length == 0) {
}
else {
results.reverse(); // put the results into the desired order
results.forEach(function(result) {
// do something with each result
});
}
});
이 방법을 시도해 볼 수 있습니다.
컬렉션의 총 레코드 수를
db.dbcollection.count()
그런 다음 skip을 사용하십시오.
db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty()
컬렉션의 크기에 따라 정렬, 건너 뛰기 등이 상당히 느려질 수 있습니다.
일부 기준에 따라 콜렉션을 색인화하면 성능이 향상됩니다. 그런 다음 min () 커서를 사용할 수 있습니다.
먼저 컬렉션을 db.collectionName.setIndex( yourIndex )
사용 하여 색인화 오름차순 또는 내림차순을 사용할 수 있습니다. 항상 "N 마지막 항목"을 원하기 때문입니다. 따라서 내림차순으로 색인을 생성하는 경우 "첫 번째 N 항목"을 얻는 것과 같습니다. .
그런 다음 컬렉션의 첫 번째 항목을 찾아 다음과 같은 검색에서 해당 인덱스 필드 값을 최소 기준으로 사용합니다.
db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)
min () 커서에 대한 참조는 다음과 같습니다. https://docs.mongodb.com/manual/reference/method/cursor.min/
find
옵션을 사용하고 싶을 수도 있습니다 : http://docs.meteor.com/api/collections.html#Mongo-Collection-find
db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
@ 빈 첸,
컬렉션에있는 문서 하위 집합의 최신 n 개 항목에 대해 집계를 사용할 수 있습니다. 다음은 그룹화가없는 단순화 된 예입니다 (이 경우 4 단계와 5 단계 사이에서 수행함).
"오름차순으로 정렬 된"timestamp "필드를 기준으로 최신 20 개의 항목을 반환합니다. 그런 다음 각 문서 _id, 타임 스탬프 및 whatever_field_you_want_to_show를 결과에 투영합니다.
var pipeline = [
{
"$match": { //stage 1: filter out a subset
"first_field": "needs to have this value",
"second_field": "needs to be this"
}
},
{
"$sort": { //stage 2: sort the remainder last-first
"timestamp": -1
}
},
{
"$limit": 20 //stage 3: keep only 20 of the descending order subset
},
{
"$sort": {
"rt": 1 //stage 4: sort back to ascending order
}
},
{
"$project": { //stage 5: add any fields you want to show in your results
"_id": 1,
"timestamp" : 1,
"whatever_field_you_want_to_show": 1
}
}
]
yourcollection.aggregate(pipeline, function resultCallBack(err, result) {
// account for (err)
// do something with (result)
}
결과는 다음과 같습니다.
{
"_id" : ObjectId("5ac5b878a1deg18asdafb060"),
"timestamp" : "2018-04-05T05:47:37.045Z",
"whatever_field_you_want_to_show" : -3.46000003814697
}
{
"_id" : ObjectId("5ac5b878a1de1adsweafb05f"),
"timestamp" : "2018-04-05T05:47:38.187Z",
"whatever_field_you_want_to_show" : -4.13000011444092
}
도움이 되었기를 바랍니다.
db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)
mongoDB 설명서 에 따르면 :
{$ natural : 1}을 지정하여 쿼리가 전달 수집 스캔을 수행하도록 할 수 있습니다.
{$ natural : -1}을 지정하여 쿼리가 리버스 컬렉션 검색을 수행하도록 할 수도 있습니다.
$ slice 연산자를 사용 하여 배열 요소를 제한하십시오.
GeoLocation.find({},{name: 1, geolocation:{$slice: -5}})
.then((result) => {
res.json(result);
})
.catch((err) => {
res.status(500).json({ success: false, msg: `Something went wrong. ${err}` });
});
지리적 위치는 마지막 5 개의 레코드를 얻는 데이터 배열입니다.
마지막 함수는 sort
아니 어야합니다 limit
.
예:
db.testcollection.find().limit(3).sort({timestamp:-1});
참고 URL : https://stackoverflow.com/questions/4421207/how-to-get-the-last-n-records-in-mongodb
'Programming' 카테고리의 다른 글
PHP에서 정적 코드 분석을 수행하는 방법은 무엇입니까? (0) | 2020.02.15 |
---|---|
Facebook 콜백이 '# _ = _'을 반환 URL에 추가합니다. (0) | 2020.02.15 |
최신 버전의 OS X (Yosemite 또는 El Capitan)를 설치 한 후`pg_tblspc`가 누락 됨 (0) | 2020.02.15 |
Visual Studio Code에서 마지막 커서 위치로 다시 이동하는 방법은 무엇입니까? (0) | 2020.02.15 |
IllegalStateException : ViewPager를 사용하여 onSaveInstanceState 후에이 조치를 수행 할 수 없습니다. (0) | 2020.02.15 |