mongoose聚合$匹配不符合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查询中添加这个$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) } }) 

您的idsvariables将由“string”构造,而不是ObjectId值。

Mongoose会将ObjectIdstring值“自动传送”到正确查询中的正确types,但是在聚合pipe道中不会发生这种情况 ,如#1399中所述。

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

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

那么你可以在你的pipe道阶段使用它们:

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

这是因为聚合stream水线“典型地”改变了文档结构,因此mongoose没有假定“模式”适用于任何给定stream水线阶段的文档。

有争议的是,当“ $match ”阶段的“第一”pipe道阶段应该这样做,因为文件确实没有被改变。 但是现在不是这样发生的。

任何可能是“string”的值或者至less不是正确的BSONtypes都需要手动转换以匹配。