mongodb는 뚜렷한 기록을 얻습니다.
사용 중mongoDB
다음과 같은 형식의 컬렉션을 가지고 있습니다.
{"id" : 1 , name : x ttm : 23 , val : 5 }
{"id" : 1 , name : x ttm : 34 , val : 1 }
{"id" : 1 , name : x ttm : 24 , val : 2 }
{"id" : 2 , name : x ttm : 56 , val : 3 }
{"id" : 2 , name : x ttm : 76 , val : 3 }
{"id" : 3 , name : x ttm : 54 , val : 7 }
다음과 같이 레코드를 내림차순으로 가져오기 위해 해당 컬렉션에 대해 문의했습니다.
db.foo.find({"id" : {"$in" : [1,2,3]}}).sort(ttm : -1).limit(3)
하지만 두 개의 같은 기록을 제공합니다id = 1
그리고 나는 그것이 1개의 레코드를 줄 수 있는 레코드를 원합니다.id
.
mongodb에서 가능합니까?
있습니다.distinct
쿼리와 함께 사용할 수 있는 mongodb 명령입니다.하지만, 저는 이것이 단지 당신이 명명한 특정 키에 대한 고유한 값 목록을 반환한다고 생각합니다(즉, 당신의 경우, 당신은 ID 값만 반환받을 수 있습니다). 그래서 저는 이것이 당신이 전체 문서가 필요하다면 당신이 원하는 것을 정확하게 제공할 수 있을지 확신하지 못합니다. 대신에 MapReduce가 필요할 수도 있습니다.
별도의 문서: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct
집계를 사용하려고 합니다.다음과 같이 할 수 있습니다.
db.test.aggregate([
// each Object is an aggregation.
{
$group: {
originalId: {$first: '$_id'}, // Hold onto original ID.
_id: '$id', // Set the unique identifier
val: {$first: '$val'},
name: {$first: '$name'},
ttm: {$first: '$ttm'}
}
}, {
// this receives the output from the first aggregation.
// So the (originally) non-unique 'id' field is now
// present as the _id field. We want to rename it.
$project:{
_id : '$originalId', // Restore original ID.
id : '$_id', //
val : '$val',
name: '$name',
ttm : '$ttm'
}
}
])
아주 빠른 시간 내가...100,000개 문서의 테스트 DB에 대해 ~90ms입니다.
예:
db.test.find()
// { "_id" : ObjectId("55fb595b241fee91ac4cd881"), "id" : 1, "name" : "x", "ttm" : 23, "val" : 5 }
// { "_id" : ObjectId("55fb596d241fee91ac4cd882"), "id" : 1, "name" : "x", "ttm" : 34, "val" : 1 }
// { "_id" : ObjectId("55fb59c8241fee91ac4cd883"), "id" : 1, "name" : "x", "ttm" : 24, "val" : 2 }
// { "_id" : ObjectId("55fb59d9241fee91ac4cd884"), "id" : 2, "name" : "x", "ttm" : 56, "val" : 3 }
// { "_id" : ObjectId("55fb59e7241fee91ac4cd885"), "id" : 2, "name" : "x", "ttm" : 76, "val" : 3 }
// { "_id" : ObjectId("55fb59f9241fee91ac4cd886"), "id" : 3, "name" : "x", "ttm" : 54, "val" : 7 }
db.test.aggregate(/* from first code snippet */)
// output
{
"result" : [
{
"_id" : ObjectId("55fb59f9241fee91ac4cd886"),
"val" : 7,
"name" : "x",
"ttm" : 54,
"id" : 3
},
{
"_id" : ObjectId("55fb59d9241fee91ac4cd884"),
"val" : 3,
"name" : "x",
"ttm" : 56,
"id" : 2
},
{
"_id" : ObjectId("55fb595b241fee91ac4cd881"),
"val" : 5,
"name" : "x",
"ttm" : 23,
"id" : 1
}
],
"ok" : 1
}
찬성: 거의 틀림없이 가장 빠른 방법입니다.
단점: 복잡한 집계 API 사용을 포함합니다.또한 문서의 원래 스키마와 긴밀하게 연결되어 있습니다.하지만, 이것을 일반화하는 것은 가능할지도 모릅니다.
저는 당신이 이렇게 골재를 사용할 수 있다고 믿습니다.
collection.aggregate({
$group : {
"_id" : "$id",
"docs" : {
$first : {
"name" : "$name",
"ttm" : "$ttm",
"val" : "$val",
}
}
}
});
문제는 조회에서 일치 결과를 선택하는 방법에 대한 논리를 제공하지 않고 일치 레코드 3개를 하나로 압축하려는 경우입니다.
기본적으로 어떤 종류의 집계 로직(예: 각 열의 최대값 또는 최소값 선택)을 지정하거나 고유 쿼리 선택을 실행하고 고유하게 만들 필드만 선택할 수 있습니다.
querymongo.com 은 SQL에서 MongoDB로 이러한 고유한 쿼리를 잘 번역해 줍니다.
예를 들어, 다음 SQL은 다음과 같습니다.
SELECT DISTINCT columnA FROM collection WHERE columnA > 5
다음 MongoDB로 반환됩니다.
db.runCommand({
"distinct": "collection",
"query": {
"columnA": {
"$gt": 5
}
},
"key": "columnA"
});
자바스크립트를 사용하여 뚜렷한 결과를 파일에 쓰고 싶다면...이게 당신이 하는 방법입니다.
cursor = db.myColl.find({'fieldName':'fieldValue'})
var Arr = new Array();
var count = 0;
cursor.forEach(
function(x) {
var temp = x.id;
var index = Arr.indexOf(temp);
if(index==-1)
{
printjson(x.id);
Arr[count] = temp;
count++;
}
})
고유 쿼리를 지정합니다.다음 예제는 항목 필드에 포함된 필드 SKU에 대한 고유 값을 "A"와 동일한 문서에서 반환합니다.
db.inventory.distinct( "item.sku", { dept: "A" } )
참조: https://docs.mongodb.com/manual/reference/method/db.collection.distinct/
언급URL : https://stackoverflow.com/questions/5089162/mongodb-get-distinct-records
'sourcecode' 카테고리의 다른 글
도커 구성: mariadb - 연결이 거부됨 (0) | 2023.07.02 |
---|---|
USER()와 SYS_CONTEXT('USERNV', 'CURRENT_USER')의 차이점은 무엇입니까? (0) | 2023.07.02 |
Gitstash 팝업 - 필요 병합, 인덱스를 새로 고칠 수 없습니다. (0) | 2023.07.02 |
차단 응용프로그램 설계에서 Spring Webflux의 WebClient를 사용하면 RestTemplate보다 리소스를 더 많이 사용합니까? (0) | 2023.07.02 |
스토어 fake api 배열에서 새 항목 이동 해제 (0) | 2023.07.02 |