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 先填充,然后根据填充的字段进行过滤

如何填充 Mongoose 数组中的字段?

如何使用 Mongoose 查询过滤到数组类型字段中具有指定值的文档?

Mongoose:如何使用来自模式的数据(产品值)使用方法填充另一个模式()中的字段?

Mongoose 查询过滤数组并填充相关内容

Mongoose:填充填充字段