node.js - 无法在来自nodejs的猫鼬中使用聚合
问题描述
我在 mongodb 中有两个名为“用户”和“帖子”的集合
用户看起来像这样:-
[
{
"_id": "5e3ffba65bad3a38dc0509cd",
"name": "Ekansh Jain",
"email": "ejekanshjain@gmail.com",
"password": "$2a$10$lF1evuJgfC0N7fIC4I7KrOG.lq56aiHzndIYwc/YRb3auLTgHfmGK",
"createdAt": "2020-02-09T12:31:34.117Z",
"updatedAt": "2020-02-09T12:31:34.117Z",
"__v": 0
},
{
"_id": "5e403dcd1000793694bd2276",
"name": "Ekansh Jain",
"email": "ejekanshjain2@gmail.com",
"password": "$2a$10$qGmng4KrXVXKt0RLnSMgMueo.BenKM43QIpURrzxW4M.HGDHe//TC",
"createdAt": "2020-02-09T17:13:49.508Z",
"updatedAt": "2020-02-09T17:13:49.508Z",
"__v": 0
}
]
帖子看起来像这样
[
{
"_id": "5e403aa22a28e430b0d2641a",
"title": "My Post 1",
"body": "this is my first post's body",
"createdBy": "5e3ffba65bad3a38dc0509cd",
"createdAt": "2020-02-09T17:00:18.991Z",
"updatedAt": "2020-02-09T17:00:18.991Z",
"__v": 0,
"userInfo": []
},
{
"_id": "5e403e8b1000793694bd2278",
"title": "LOL",
"body": "LOL",
"createdBy": "5e403dcd1000793694bd2276",
"createdAt": "2020-02-09T17:16:59.513Z",
"updatedAt": "2020-02-09T17:16:59.513Z",
"__v": 0,
"userInfo": []
},
{
"_id": "5e46c8cfe56d4325b4e8d334",
"title": "test Post",
"body": "this is my first post's body",
"createdBy": "5e3ffba65bad3a38dc0509cd",
"createdAt": "2020-02-14T16:20:31.771Z",
"updatedAt": "2020-02-14T16:20:31.771Z",
"__v": 0,
"userInfo": []
}
]
我的 nodejs express 应用程序中有两个猫鼬模型,名为 User 和 Post。
我无法聚合(无法对帖子和用户应用内部联接)
这是我目前正在使用的代码:-
const posts = await Post.aggregate([
{
"$lookup": {
"from": "users",
"localField": "createdBy",
"foreignField": "_id",
"as": "userInfo"
}
}
]).exec()
结果,它返回带有空 userInfo 对象的帖子对象数组。有人可以帮我解决这个...
解决方案
由于createdBy
字符串 &_id
是 type ObjectId()
,那么您需要将两个字段都设置为相同的类型,试试这个:
Post.aggregate([
{
$lookup:
{
from: "users",
let: { createdBy: "$createdBy" },
pipeline: [
{
$match:
{
$expr:
{ $eq: [{ $toObjectId: "$$createdBy" }, "$_id"] }
}
}
],
as: "userInfo"
}
}
])
测试: MongoDB-游乐场
注意:或者,如果您不想在每次需要存储createdBy
为ObjectId()
.
所以在你的Post
模型createdBy
类型中应该是Schema.Types.ObjectId
.
在保存 Post 文档时createdBy : mongoose.Types.ObjectId('someString');
推荐阅读
- git - Git:为什么我的工作树创建后消失了?
- angular - Angular 5 - 在新窗口中打开带有 CSS 类的链接
- python - 元素不可点击,因为另一个元素遮住了它
- maven - 删除'junit-platform-surefire-provider'后,在Junit5中通过@Tag注释执行测试将不起作用
- html - 部分FA图标在FF、Chrome、Safari中显示,但没有浏览器全部显示
- kotlin - TornadoFX 中的列表视图在使用缓存表单时显示重复的项目
- istio - 使用 helm 删除 istio 会留下一些工件,其中一些我无法删除。我该如何删除它?
- r - 标记第一次出现的数字和之后的所有行
- ios - UITableViewCell 详细文本标签布局不当
- java - firebase 错误 默认 FirebaseApp 未在此过程中初始化