首页 > 解决方案 > Mongoose如何过滤填充字段

问题描述

我有订单和用户,我想通过 Mongoose Populate 或其他方式通过用户电话号码查找订单我该怎么做?

订单 (_id, item, user_id) 用户 (_id, email, phone)

const orders = await Order.find({}).populate({path: 'user', select: 'phone'})

我想要类似的东西(user.phone ='xxxxxx')我无法弄清楚。

谢谢

标签: mongodbmongoosemongodb-querymongoose-populate

解决方案


更简单的解决方案

首先从具有给定电话号码的用户集合中找到 UserInstance。

db.user.find({phone: PhoneNumber})

然后从该用户的订单集合中找到 OrderInstances。

db.order.find({user_id: userInstance._id})

为什么不使用填充

填充是 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' }
});

如果您定义这样的模型,然后使用填充来查找用户订单。然后发生以下步骤:

  1. 查找所有订单并填充用户。

    db.order.find().populate('user_id')

  2. 过滤具有电话号码的用户的订单。

这确实是低效的,因为它每次都获取所有订单并且不使用数据库高效查询。mongoDB 原生的 $lookup 也是如此。


推荐阅读