为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MM们 2019-07-09 16:01:28
月鹅集合$Match与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查询,则返回空数组。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)         }     })
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

你的ids变量将由“字符串”构成,而不是ObjectId价值。

猫鼬的“自动转换”字符串值ObjectId在常规查询中的正确类型,但如下所示不在聚合管道中发生。,如第1399号问题所述。

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

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

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

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

原因是聚合管道“典型地”改变了文档结构,因此猫鼬不假定“模式”在任何给定的管道阶段都适用于文档。

有争议的是,当“第一”管道阶段是$match阶段应该做到这一点,因为文件确实没有改变。但现在情况并非如此。

任何可能是“字符串”或至少不是正确bson类型的值都需要手动转换才能匹配。


查看完整回答
反对 回复 2019-07-09
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

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

查看完整回答
反对 回复 2019-07-09
?
ITMISS

TA贡献1871条经验 获得超8个赞

我花了三天才到这里;叹息.。我在我的模式静态方法中创建了一个Lamda。const castUserId = (userId) => mongoose.Types.ObjectId(userId)现在我很高兴 

查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 650 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信