我想通过ID(56e641d4864e5b780bb992c656e65504a323ee0812e511f2)显示产品,并在扣除折扣后显示价格(如果可用).

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

推荐答案

ids变量将由"字符串"构成,而不是ObjectId个值.

在常规查询中,Mongoose会将ObjectId的字符串值"自动广播"到正确的类型中,但这是does not happen in the aggregation pipeline,如第1399期所述.

相反,您必须进行正确的转换才能手动键入:

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

然后,您可以在管道阶段使用它们:

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

原因是聚合管道"通常"会改变文档 struct ,因此mongoose不会假定"模式"适用于任何给定管道阶段的文档.

有争议的是,当"第一"管道阶段是$match个阶段时,应该这样做,因为文档确实没有更改.但现在情况并非如此.

任何可能是"字符串"或至少不是正确的BSON类型的值都需要手动强制转换才能匹配.

Mongodb相关问答推荐

会话的Mongo-go驱动程序版本.Copy()

MongoDB中的字符串聚合

在mongdob中按子文档筛选不起作用

MongoDB对两个串联数组进行排序

从具有多个数组匹配 MongoDB 的两个集合中采样数据

聚合 $accumulator + $project

MongoDB - 分组并找到前 N 个

从 node.js 的 mongodb 集合中删除文档

类型错误:db.close is not a function

MongoDB:插入重复键更新

mongodb中集合的最大大小是多少

MongoDB 的 Java 语法

MongoDB:按标签获取文档

获取收集字节使用情况统计信息的pymongo方法?

Golang/mgo:如何让 MongoDB 在字段中使用当前时间?

Mongodb $lookup 使用 _id 无效果

pre save和validate之间的mongoose区别?什么时候用哪一个?

MongoError:Can't extract geo keys from object

是否可以使用聚合框架对 MongoDB 中的 2 个字段求和?

Spring Data MongoDB - 在哪里以编程方式为 Mongo 集合创建索引?