mongodb - Mongoose如何过滤填充字段
问题描述
我有订单和用户,我想通过 Mongoose Populate 或其他方式通过用户电话号码查找订单我该怎么做?
订单 (_id, item, user_id) 用户 (_id, email, phone)
const orders = await Order.find({}).populate({path: 'user', select: 'phone'})
我想要类似的东西(user.phone ='xxxxxx')我无法弄清楚。
谢谢
解决方案
更简单的解决方案
首先从具有给定电话号码的用户集合中找到 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' }
});
如果您定义这样的模型,然后使用填充来查找用户订单。然后发生以下步骤:
查找所有订单并填充用户。
db.order.find().populate('user_id')
过滤具有电话号码的用户的订单。
这确实是低效的,因为它每次都获取所有订单并且不使用数据库高效查询。mongoDB 原生的 $lookup 也是如此。
推荐阅读
- html - 如何在视频元素中播放画布?
- java - 使用 Spring WebFlux 路由器功能时如何获取模型属性?
- kotlin - Kotlin:Map.get(key) 与 Map.getValue(key)
- r - randomForest 和 randomForestSRC 的深度和 OOB 误差
- python - Python - 无法在类中的方法之间传递变量
- android - TruckRestrictionPenalty=soft 在此处映射 android sdk
- windows - 将文件的时间戳与当前时间戳进行比较
- python - 如何为列表中的每个元素分配条件
- python - 使用 numpy.ndarray.ndim(arr) 直接获取维数
- android - JSON对象到字符串数组