mongoose聚合$匹配不符合ID的
我想通过ID( 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) } })
如果我$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) } })
您的ids
variables将由“string”构造,而不是ObjectId
值。
Mongoose会将ObjectId
string值“自动传送”到正确查询中的正确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都需要手动转换以匹配。