SQL에 너무 익숙해지면서 mongoDB에이 문제가 발생했습니다. 먼저 몽구스를 사용하고 있습니다.MongoDB 쿼리 결과의 사용자 정의 필드
이제 문제가 발생했습니다. 나는 User
이라는 콜렉션을 가지고있다.
var UserSchema = new Schema ({
id : ObjectId,
name : {type : String, trim : true, required : true},
email: {type:String, trim:true, required: true, index: { unique: true }},
password: {type:String, required: true, set: passwordToMD5},
age: {type:Number, min: 18, required: true, default: 18},
gender: {type: Number, default:0, required: true},
height: {type: Number, default:180, min: 140, max: 220},
_eye_color: {type: ObjectId, default: null},
location: {
lon: {type: Number, default: 0},
lat: {type: Number, default: 0}
},
status: {type:Number, required: true, default:0}
},{
toObject: { virtuals: true },
toJSON: { virtuals: true },
collection:"user"});
이제이 컬렉션의 모든 사용자를 선택하고 특수 속성 (예 : "순위")별로 정렬해야합니다. 이 등급은 주어진 시점과의 거리, 나이와 비교 한 특정 논리에 따라 계산됩니다.
그래서이 순위를 선택한 다음 정렬에 사용하는 방법이 궁금합니다. 가상을 사용하려고 시도했지만 추가 정보를 세는 것이 편리하지만, 불행히도 find()
결과를 가상 필드로 정렬 할 수는 없습니다. 물론 가상에서이 순위를 계산 한 다음 모든 레코드를 선택한 다음 콜백에서 일부 자바 스크립트를 수행 할 수 있습니다. 하지만이 경우 모든 사용자를 선택하고 정렬 한 다음 자바 스크립트 부분이 너무 오래 걸릴 수 있습니다. mapreduce을 사용하려고 생각했지만 그게 내가 원하는 것을 할 수 있을지 확신 할 수 없습니다. 내 작업이 가능할 경우 누군가 내게 힌트를 줄 수 있습니까 mongoDB/mongoose? 1
편집은 또한 통합 프레임 워크를 사용하는 것을 시도했다, 처음에는 $project
능력을 가진 최고의 솔루션이 될 것 같았다. 그러나 순위 계산이 필요할 때, 나는 집계가 sin
, cos
및 sqrt
과 같은 많은 수학 함수를 지원하지 않는다는 것을 알았습니다. 또한 사전 정의 된 일반적인 자바 스크립트 함수를 프로젝션에 사용하는 것은 불가능했습니다. 함수가 호출되었지만 현재 레코드 필드를 전달할 수 없었습니다.
{$project: {
distance_from_user: mUtils.getDistance(point, this.location)
}
내부 기능은 두 번째 attr이 "정의되지 않음"입니다.
그래서 집계 프레임 워크로 내 순위 계산을 수행하는 것은 불가능합니다. 2 확인
편집, 나는 모든 사람들이 실시간 쿼리 좋지 않다으로 맵리 듀스를 사용하지 말라고 말한다 알고,하지만 난 집계를 사용할 수 없기 때문에, 나는 맵리 듀스를 시도 할 것 같아요. 자,이지도를 축소한다고 가정 해 봅시다.
function map() {
emit(1, // Or put a GROUP BY key here
{name: this.name, // the field you want stats for
age: this.age,
lat: this.location.lat,
lon: this.location.lon,
distance:0,
rank:0
});
}
function reduce(key, values) {
return val;
}
function finalize(key, value){
return value;
}
var command = {'mapreduce': "user", 'map': map.toString(), 'reduce': reduce.toString(), query:{$and: [{gender: user_params.gender}, {_id: {$ne: current_user_id}}]}, 'out': {inline:1}};
mongoose.connection.db.executeDbCommand(command, function(error, result){
if(error) {
log(error);
return;
}
log(result);
return;
});
모든 사용자의 순위를 계산하려면 무엇을 줄이거 나 변경해야합니까?
'실시간'쿼리에 mapreduce를 사용하지 마십시오. 집계 프레임 워크 살펴보기 http://docs.mongodb.org/manual/applications/aggregation/ – Alex
집계를 시도했지만 집계 프레임 워크에서 순위 계산에 필요한 함수를 사용할 수 없습니다. 예를 들어'sqrt()','sin()','cos()'등은 없습니다. – ArVan