Mongoose如何过滤填充字段
Posted
技术标签:
【中文标题】Mongoose如何过滤填充字段【英文标题】:Mongoose how to filter on populate field 【发布时间】:2018-12-28 20:05:12 【问题描述】:我有订单和用户,我想通过 Mongoose Populate 或其他方式通过用户电话号码查找订单我该怎么做?
订单(_id,item,user_id) 用户(_id、电子邮件、电话)
const orders = await Order.find().populate(path: 'user', select: 'phone')
我想要这样的东西,我无法弄清楚 (user.phone='xxxxxx')。
谢谢
【问题讨论】:
看看在集合上使用 $lookup 而不是尝试过滤填充,如下所示:***.com/questions/11303294/… 【参考方案1】:更简单的解决方案
首先从具有给定电话号码的用户集合中找到 UserInstance。
db.user.find(phone: PhoneNumber)
然后从该用户的订单集合中找到 OrderInstances。
db.order.find(user_id: userInstance._id)
为什么不使用填充
Populate 是 Mongoose 库方法,而不是原生 MongoDb 方法。要使用 Populate,您必须定义您的模式 相应地。
var user = Schema(
_id: Schema.Types.ObjectId,
email: String,
phone: Number,
);
var order = Schema(
_id: Schema.Types.ObjectId,
item: String,
user_id: type: Schema.Types.ObjectId, ref: 'user'
);
如果您定义这样的模型,然后使用填充来查找用户订单。然后发生以下步骤:
查找所有订单并填充用户。
db.order.find().populate('user_id')
为具有电话号码的用户过滤订单。
这确实是低效的,因为它每次都获取所有订单,而不是使用数据库高效查询。 mongoDB 原生的 $lookup 也是如此。
【讨论】:
以上是关于Mongoose如何过滤填充字段的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Mongoose 查询过滤到数组类型字段中具有指定值的文档?