복붙노트

[MONGODB] ID를 일치하지 않습니다 총 $ 일치 몽구스

MONGODB

ID를 일치하지 않습니다 총 $ 일치 몽구스

나는 가능한 경우 할인 뺀 후 IDS (56e641d4864e5b780bb992c6 및 56e65504a323ee0812e511f2) 및 쇼 가격으로 제품을 게재하려는.

나는 총을 사용하는 최종 가격을 계산 할 수 있지만, 모음에있는 모든 문서를, 어떻게하려면이 수익에만 일치 ID를 반환

"_id" : ObjectId("56e641d4864e5b780bb992c6"), 
"title" : "Keyboard", 
"discount" : NumberInt(10),
"price" : NumberInt(1000)

"_id" : ObjectId("56e65504a323ee0812e511f2"), 
"title" : "Mouse", 
"discount" : NumberInt(0),
"price" : NumberInt(1000)

"_id" : ObjectId("56d90714a48d2eb40cc601a5"), 
"title" : "Speaker", 
"discount" : NumberInt(10),
"price" : NumberInt(1000)

이 내 쿼리입니다

productModel.aggregate([
        {
            $project: {
                title   : 1,
                price: {
                    $cond: {
                        if: {$gt: ["$discount", 0]}, then: {$subtract: ["$price", {$divide: [{$multiply: ["$price", "$discount"]}, 100]}]}, else: "$price"
                    }

                }
            }
        }
    ], function(err, docs){
        if (err){
            console.log(err)
        }else{
            console.log(docs)
        }
    })

내가 쿼리에서이 $를 추가 할 경우, 그것은 하늘의 배열을 돌려줍니다

productModel.aggregate([
            {
                $match: {_id: {$in: ids}}
            },
            {
                $project: {
                    title   : 1,
                    price: {
                        $cond: {
                            if: {$gt: ["$discount", 0]}, then: {$subtract: ["$price", {$divide: [{$multiply: ["$price", "$discount"]}, 100]}]}, else: "$price"
                    }

                }
            }
        }
    ], function(err, docs){
        if (err){
            console.log(err)
        }else{
            console.log(docs)
        }
    })

해결법

  1. ==============================

    1.귀하의 IDS 변수는 "문자열", 그리고 ObjectId가 값으로 구성됩니다.

    귀하의 IDS 변수는 "문자열", 그리고 ObjectId가 값으로 구성됩니다.

    일반 쿼리에서 올바른 타입으로 ObjectId가에 대한 "autocasts"문자열 값을 몽구스,하지만 문제 # 1399에 설명처럼이, 집계 파이프 라인에서 발생하지 않습니다.

    대신 수동으로 입력 할 올바른 캐스팅을 수행해야합니다 :

    ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })
    

    그런 다음 당신은 당신의 파이프 라인 단계에서 사용할 수 있습니다 :

    { "$match": { "_id": { "$in": ids } } }
    

    통합 파이프 라인은 "일반적으로"문서 구조를 변경, 따라서 몽구스은 "스키마"주어진 파이프 라인 단계에서 문서에 적용한다는 가정을하지 않습니다 때문에 이유입니다.

    그것은 논쟁의 여지가있다 그것이 실제로 문서가 변경되지 않기 때문에,이 작업을 수행해야 $ 일치하는 단계는 "첫 번째"파이프 라인 단계. 그런 일이 어떻게하지만 지금이 없습니다.

    아마도 "문자열"또는 적어도하지 올바른 BSON 형 필요성 될 수있는 값은 수동으로 일치하기 위해 주조한다.

  2. from https://stackoverflow.com/questions/36193289/moongoose-aggregate-match-does-not-match-ids by cc-by-sa and MIT license