首页 > 解决方案 > 使用自定义过滤器从多个表中获取 Mongodb 数据

问题描述

我正在像这样从 Mongodb 获取数据。

 orders = await ordersCollection
 .find(rest)
 .sort({ dateAdded: -1 })
 .skip(parseInt(skip))
 .limit(parseInt(limit))
 .toArray();

此查询返回订单集合中的数据。但是在订单集合中,我有一个用户 ID 和用户表。每个用户的 _Id 都与电子邮件等其他一些数据一起列出。我需要那个电子邮件字段。怎么可能?我已经尝试过 $lookup 和 aggregate 但还没有运气。也许还有其他一些技术可以与过滤器一起使用,比如排序、跳过、限制。

这是两个集合的样子。

订单收集

    {"_id":"5d7f276d86250800408856c5","type":"admin-credit",
    "userId":"5d7f074644de5a00b1c0d5c6",
    "fromAccount":"",
    "toAccount":"AUD",
    "amount":20,"fee":0,
    "quote":null,
    "linkId":null,
    "dateAdded":"2019-09-16T06:10:53.554Z",
    "dateApproved":"2019-09-16T06:10:53.614Z",
    "orderStatus":"approved",
    "adminId":"5d7f05b71450370072212b89"}

用户集合

{"_id":"5d7f074644de5a00b1c0d5c6",
"email":"pardeep889@hotmail.com",
"hash":"$2a$10$ocdE3gwsGZR8N5Yauhg1MeKIU11UkKrHynnYWB24x/TWR2WhM/nIu",
"confirmationToken":"e7e0ca1a-cc73-4691-8472-"
"ipAddrs":[{"ip":"192.180.2.15",
"date":"2019-09-16T03:54:03.972Z"}],
"socketToken":"c6a7fc7c-f983-439a-bafa-e93618e0a4e8"
}

我如何尝试获取数据。

   orders = await ordersCollection
        .find(rest)
        .sort({ dateAdded: -1 })
        .skip(parseInt(skip))
        .limit(parseInt(limit))
        .aggregate([
          {
            $lookup: {
              from: "users",
              localField: "user_id",
              foreignField: "_id",
              as: "new record"
            }
          }])
        .toArray();

我需要订单的电子邮件字段。

标签: node.jsmongodb

解决方案


如果需要,可以在聚合管道中使用$sort和。$limit另请注意,我已$match为过滤条件添加:

db.orders.aggregate([
  { $match: {} },
  {
    $lookup: {
      from: "users",
      localField: "userId",
      foreignField: "_id",
      as: "userDoc"
    }
  },
  { $unwind: "$userDoc" },
  {
    $project: {
      _id: 1,
      type: 1,
      userId: 1,
      fromAccount: 1,
      toAccount: 1,
      amount: 1,
      fee: 1,
      quote: 1,
      linkId: 1,
      dateAdded: 1,
      dateApproved: 1,
      orderStatus: 1,
      adminId: 1,
      email: "$userDoc.email"
    }
  }
]);

注意:$project用于返回来自已加入集合文档的所有字段,orders并且仅返回来自已加入集合文档的电子邮件。


推荐阅读