Mongodb Mongoose如何在填充字段上进行筛选

Mongodb Mongoose如何在填充字段上进行筛选,mongodb,mongoose,mongodb-query,mongoose-populate,Mongodb,Mongoose,Mongodb Query,Mongoose Populate,我有订单和用户,我想通过Mongoose Populate或其他方式通过用户电话号码查找订单,我该怎么做 订单(\u id、项目、用户\u id) 用户(id、电子邮件、电话) const orders=wait Order.find({})。填充({path:'user',select:'phone'}) 我想要这样的东西,在那里(user.phone='xxxxxx')我无法理解 谢谢一个更简单的解决方案 首先从具有给定电话号码的用户集合中查找UserInstance db.user.fin

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

订单(\u id、项目、用户\u id) 用户(id、电子邮件、电话)

const orders=wait Order.find({})。填充({path:'user',select:'phone'})

我想要这样的东西,在那里(user.phone='xxxxxx')我无法理解


谢谢一个更简单的解决方案

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

db.user.find({phone: PhoneNumber})
然后从该用户的订单集合中查找订单实例

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\u id')

  • 使用电话号码筛选用户的订单

  • 这是非常低效的,因为它每次都获取所有订单,而不使用DB高效查询。
    mongoDB自带的$lookup也会出现同样的情况。

    请注意在集合上使用$lookup,而不是尝试在填充时进行筛选,如下所示: