[MONGODB] 몽구스 - 어떻게하여 그룹과 채우려면?
MONGODB몽구스 - 어떻게하여 그룹과 채우려면?
나는 나의 ODM으로 MongoDB를하고 몽구스를 사용하고 난 같은 문으로 채우고 그룹을 사용하여 쿼리를 만들기 위해 노력하고있어.
여기 내 간단한 문서 모델은 다음과 같습니다
var userSchema = new Schema({
username: String
});
var messageSchema = new Schema({
from: { type: Schema.ObjectId, ref: 'User' },
to: { type: Schema.ObjectId, ref: 'User' },
message: String,
date: { type: Date, default: Date.now }
});
난 그냥 그와 함께 이야기 각 사용자가 하나의 사용자, 그룹에 대한 모든 메시지를 얻기 위해 노력하고있어. 나는이 같은 시도 :
this.find({ 'to': user })
.sort({ 'date': 1 })
.group('from')
.populate(['from', 'to'])
.exec(callback);
그러나 불행하게도, 나의 모델은 그룹 방법이 없습니다. 이 작업을 얻을 수있는 솔루션을 가지고 있습니까?
감사합니다.
해결법
-
==============================
1.예 배열 따라서 $의 풀림은 $ 룩업 채우으로 채워 룩업을 사용.
예 배열 따라서 $의 풀림은 $ 룩업 채우으로 채워 룩업을 사용.
Message.aggregate( [ { "$match": { "to": user } }, { "$sort": { "date": 1 } }, { "$group": { "_id": "from", "to": { "$first": "$to" }, "message": { "$first": "$message" }, "date": { "$first": "$date" }, "origId": { "$first": "$_id" } }}, { "$lookup": { "from": "users", "localField": "from", "foreignField": "_id", "as": "from" }}, { "$lookup": { "from": "users", "localField": "to", "foreignField": "_id", "as": "to" }}, { "$unwind": { "path" : "$from" } }, { "$unwind": { "path" : "$to" } } ], function(err,results) { if (err) throw err; return results; } )
-
==============================
2.여기에 사용하는 더 나은 옵션은 처리 결과에 자바 스크립트 엔진을 사용하여 MongoDB의 .group () 메소드와 달리 네이티브 코드 구현되는, () .aggregate이다.
여기에 사용하는 더 나은 옵션은 처리 결과에 자바 스크립트 엔진을 사용하여 MongoDB의 .group () 메소드와 달리 네이티브 코드 구현되는, () .aggregate이다.
.populate 같은 방법 () 직접하지만 지원되지 않으며, 집계 파이프 라인 및 다른 방법은 엄격하게 현재 모델의 스키마를 기반으로하는 응답을 반환하지 않기 때문에 이것은 의도적으로 설계된 동작입니다. 당신이하고있는 일입니다 "가정"잘못 될 때문에, 그냥 원시 객체의 반응이다.
몽구스 문서로 응답을 "캐스팅"다음 필요한 경로와 .populate ()의 모델 형태를 호출을 중지 아무것도 그러나 없다 :
Message.aggregate( [ { "$match": { "to": user } }, { "$sort": { "date": 1 } }, { "$group": { "_id": "from", "to": { "$first": "$to" }, "message": { "$first": "$message" }, "date": { "$first": "$date" }, "origId": { "$first": "$_id" } }} ], function(err,results) { if (err) throw err; results = result.map(function(doc) { doc.from = doc._id doc._id = doc.origId; delete doc.origId; return new Message( doc ) }); User.populate( results, { "path": "from to" }, function(err,results) { if (err) throw err; console.log( JSON.stringify( results, undefined, 4 ) ); }); } )
물론, 그것은 정말 각 "에서"같은 운영자에 의해 암시에서 $ 첫 번째 메시지를 반환합니다.
아마도 당신이 정말로 "그룹화"는 무엇을 의미하는 "종류"에 실제로 :
Message.find({ "to": user }) .sort({ "from": 1, "date": 1 }) .populate("from to") .exec(function(err,messsages) { if (err) throw err; console.log( JSON.stringify( messages, undefined, 4 ) ); });
당신의 문맥은 "모든 메시지"가 아니라, 그렇지 않으면 같은 .aggregate와 같은 그룹화 운영자에 의해 암시 될 것을 () 또는 .group () 수집 방법을 말처럼. 메시지 그래서 오히려 특정 그룹보다 정렬을 통해 "그룹화".
당신이 정말로 요구하지만 실제로는 "그룹화"진짜 의도 된 경우 그와 함께 () .populate 사용하는 방법과 함께 집계 예제가있는 것을 같은 후자의 소리.
from https://stackoverflow.com/questions/25231022/mongoose-how-to-group-by-and-populate by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를에 $을 모두 사용하여 배열 값을 일치시키기위한 여러 $의 elemMatch 식? (0) | 2019.12.24 |
---|---|
[MONGODB] 포함 된 문서에 'upsert' (0) | 2019.12.24 |
[MONGODB] 어떻게하여 MongoDB에서 배열의 n 번째 요소를 삭제합니다 (0) | 2019.12.24 |
[MONGODB] 쉽게에 가이드를 저장하는 실제 GUID를 검색하는 효율적인 방법이 무엇인지 문서의 아이디에 대한 MongoDB를하고 가이드와 함께? (0) | 2019.12.24 |
[MONGODB] MongoDB의 변수를 사용하는 방법지도 기능을지도-감소 (0) | 2019.12.24 |