어떻게 Mongodb에서 마지막 N개의 레코드를 얻을 수 있지?
나는 이것을 문서화한 것을 어디에서도 찾을 수 없다.기본적으로는 find() 조작은 처음부터 레코드를 가져옵니다.mongodb에서 마지막 N개의 레코드를 얻으려면 어떻게 해야 하나요?
편집: 또한 반환된 결과를 역순이 아닌 역순에서 최신순으로 정렬하고 싶습니다.
제가 당신의 질문을 이해한다면, 당신은 오름차순으로 정렬해야 합니다.
"x"라는 이름의 ID 또는 날짜 필드가 있다고 가정하면 다음을 수행할 수 있습니다.
.timeout()
db.foo.find().sort({x:1});
1은 오름차순(최신에서 최신으로) 정렬하고 -1은 내림차순(최신에서 오래된 것으로) 정렬합니다.
auto created _ 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);
}
그리고 몽고 껍데기에서 그냥 타이핑하세요.last(N)
마지막 N개의 레코드를 가져오려면 다음 쿼리를 실행합니다.
db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)
마지막 레코드를 하나만 원하는 경우:
db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})
주의: 대신$natural
컬렉션의 열 중 하나를 사용할 수 있습니다.
컬렉션 크기에 따라 정렬, 건너뛰기 등이 매우 느릴 수 있습니다.
어떤 기준에 따라 컬렉션을 인덱스하고 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/
db.collection.find().sort({$natural: -1 }).limit(5)
@bin-chen,
집합에서 문서 하위 집합의 최신 n개 항목에 대한 집계를 사용할 수 있습니다.다음으로 그룹화를 실시하지 않는 간단한 예를 나타냅니다(이 경우 4단계와 5단계 사이에 실시합니다).
이렇게 하면 오름차순으로 정렬된 최신 20개 항목("타임 스탬프"라는 필드에 기반)이 반환됩니다.그런 다음 각 문서 _id, 타임스탬프 및 원하는 모든_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.dbcollection.count()
다음으로 skip을 사용합니다.
db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty()
컬렉션 크기는 쿼리 조건을 고려하지 않으므로 "건너뛰기"할 수 없습니다.
올바른 해결책은 원하는 엔드포인트부터 정렬하여 결과 세트의 크기를 제한한 후 필요에 따라 결과 순서를 조정하는 것입니다.
다음은 실제 코드를 기반으로 한 예입니다.
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
});
}
});
하면 .sort()
,limit()
,skip()
값에서 N N을 사용합니다.
db.collections.find().sort(key:value).limit(int value).skip(some int value);
Querying: Sorting and Natural Order, http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order 및 Cursor Methods http://www.mongodb.org/display/DOCS/Advanced+Queries에서 sort()를 확인합니다.
도 이렇게 게 것 같아요.find
옵션 : http://docs.meteor.com/api/collections.html#Mongo-Collection-find
db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
여기에는 .sort()와 .limit()를 사용합니다.
오름차순 또는 내림차순으로 정렬을 사용한 다음 제한 사용
db.collection.find({}).sort({ any_field: -1 }).limit(last_n_records);
MongoDB 나침반을 사용하면 정렬필드를 사용하여 필터링할 수 있습니다.
$slice
array elements: 어레이 를 제한하는 연산자.
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}` });
});
서 ''는geolocation
데이터 배열입니다. 여기서 마지막 5개의 레코드를 얻을 수 있습니다.
db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)
mongoDB 매뉴얼에 따르면:
{ $natural : 1 }을(를) 지정하여 쿼리가 앞으로 수집 검색을 수행하도록 할 수 있습니다.
{ $natural : -1 }을(를) 지정하여 쿼리가 역수집 검색을 수행하도록 할 수도 있습니다.
마지막 함수는 다음과 같습니다.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
'programing' 카테고리의 다른 글
숫자 키가 있는 JavaScript 개체를 배열로 변환하는 중 (0) | 2023.03.08 |
---|---|
jQuery에서 HTML 문서의 일부를 추출합니다. (0) | 2023.03.08 |
어레이를 FormData에 추가하고 AJAX를 통해 전송 (0) | 2023.03.08 |
XmlHttpRequest on progress 간격 (0) | 2023.03.08 |
js의 이상한 JSON 해석 동작 "예기치 않은 토큰:" (0) | 2023.03.08 |