月鹅集合$Match与id的不匹配

月鹅集合$Match与id的不匹配

我想按ID显示产品(56e641d4864e5b780bb992c656e65504a323ee0812e511f2)并在可用的情况下以折扣减去后显示价格。

我可以使用聚合计算最终价格,但是这会返回集合中的所有文档,如何使它只返回匹配的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)
        }
    })

如果我加上这个$in查询,则返回空数组。

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)
        }
    })


MM们
浏览 652回答 3
3回答

凤凰求蛊

你的ids变量将由“字符串”构成,而不是ObjectId价值。猫鼬的“自动转换”字符串值ObjectId在常规查询中的正确类型,但如下所示不在聚合管道中发生。,如第1399号问题所述。相反,必须执行正确的转换才能手动键入:ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) })然后,您可以在管道阶段使用它们:{ "$match": { "_id": { "$in": ids } } }原因是聚合管道“典型地”改变了文档结构,因此猫鼬不假定“模式”在任何给定的管道阶段都适用于文档。有争议的是,当“第一”管道阶段是$match阶段应该做到这一点,因为文件确实没有改变。但现在情况并非如此。任何可能是“字符串”或至少不是正确bson类型的值都需要手动转换才能匹配。

拉风的咖菲猫

这正是我的回答。一个.find()可以使用Schema当然,哪种类型的ObjectId为_id场。聚集管道不使用Schema我已经解释过了。

ITMISS

我花了三天才到这里;叹息.。我在我的模式静态方法中创建了一个Lamda。const castUserId = (userId) => mongoose.Types.ObjectId(userId)现在我很高兴 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MongoDB