node.js - 使用自定义过滤器从多个表中获取 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();
我需要订单的电子邮件字段。
解决方案
如果需要,可以在聚合管道中使用$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
并且仅返回来自已加入集合文档的电子邮件。
推荐阅读
- html - 如何在整个页面上居中(水平和垂直)卡片,这也适用于移动设备?
- machine-learning - 如何将复数输入提供给神经网络?
- azure - 通过 ARM 部署时无法在 QnA Maker 中创建 KB(未找到端点密钥)
- r - scale_x_continuous 的问题
- c# - 使用 Webview Xamarin Android 查看 pdf
- flutter - 从主色创建颜色变化
- javascript - 明确这个 javascript 数学对象语法的含义
- git - 在 Azure DevOps 上成功拉取请求后,保持 Azure DevOps 存储库与 bitbucket 同步
- python - 使用 dask.dataframe 读取 csv 的奇怪警告
- laravel - 为什么 Laravel 在 MethodNotAllowedHttpException 时回复 200 http 代码?