복붙노트

[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. ==============================

    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. ==============================

    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 사용하는 방법과 함께 집계 예제가있는 것을 같은 후자의 소리.

  3. from https://stackoverflow.com/questions/25231022/mongoose-how-to-group-by-and-populate by cc-by-sa and MIT license