加入等同于 mongoose/mongodb

Join equivalent with mongoose/mongodb

我的大部分经验都来自 MySQL,我基本上是在尝试与 Mongoose 进行等效的连接。我需要查询所有拥有特定 partner_id 订单的用户。这就是我在 MySQL

中编写查询的方式
SELECT * FROM guestUsers
LEFT JOIN partnerOrders ON guestUsers.id = partnerOrders.guest_user_id
WHERE partnerOrders.partner_id = "TF"

在我的 partnerOrders 模式中,我有 guest_user_id 字段,它是一个引用 guestUsers

的 objectId
guest_user_id: { type: Schema.Types.ObjectId, ref: 'guestUser' }

这是我目前对 mongoose 的了解,但由于我缺乏经验,我可能会完全错误地处理这个问题

const guest_users = await guestUserModel.aggregate( [
{
  $lookup: {
    from: 'partnerOrders', 
    localField: '_id', 
    foreignField: 'guest_user_id', 
    as: 'partnerOrders',
    let: {partner_id: "$partner_id"},
    pipeline: [
      {$match: {$expr: {$eq: [ "$partner_id",  "TF"] }}}
    ]
  }
}
])

任何帮助将不胜感激,感谢您抽出宝贵时间。

查询

  • 查找管道以匹配“TF”也
  • 展开以分离数组成员
  • 与根合并并替换它
  • 投影查找字段(信息无论如何都在根目录上移动)

*我无法在您的示例数据上对其进行测试,但我认为有了这个您就可以做到,否则,如果您可以添加示例数据和预期输出。

PlayMongo

aggregate(
[{"$lookup": 
   {"from": "partnerOrders",
    "localField": "_id",
    "foreignField": "guest_user_id",
    "pipeline": [{"$match": {"partner_id": {"$eq": "TF"}}}],
    "as": "partnerOrders"}},
 {"$unwind": 
   {"path": "$partnerOrders", "preserveNullAndEmptyArrays": true}},
 {"$replaceRoot": 
   {"newRoot": {"$mergeObjects": ["$partnerOrders", "$$ROOT"]}}},
 {"$unset": ["partnerOrders"]}])