$lookup inside $lookup in array of objects inside 数组
$lookup inside $lookup in array of objects inside array
我是 mongoDB 的新手。也许这是一个简单的问题。请帮我解决这个问题。
要在填充值中填充的 mongo 查询是什么?
有 3 个 tables 用户,bookHistory 和 books。我需要在所有三个中查找。
这就是我需要的结构。
"userList": [
{
"_id": "NT-723DD65BE100-444B-B441-2B2804ED7348",
"name": "AMC",
"uid": "NT-723DD65BE100-444B-B441-2B2804ED7348",
"bookHistory": [
{
"_id": "SHNH-06E723698ED8-420F-AB6D-6574633F5984",
"bookStocksId": "SHNC-4559F09A7F4B-4508-9F61-2A2CD248D3F9",
"bookId": "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
"uid": "NT-723DD65BE100-444B-B441-2B2804ED7348",
"bookDetails": {
"_id": "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
"nameOfBook": "test",
"nameOfAuthor": "test authou",
}
},
{
"_id": "617e6c068bf26821f955b034",
"bookStocksId": "SHNC-694DF63AE953-40A8-B49B-71E46D0A9463",
"bookId": "SHN-5B5A2712CE88-46BF-8A5F-F01174316025",
"uid": "NT-723DD65BE100-444B-B441-2B2804ED7348",
"bookDetails": {
"_id": "SHN-5B5A2712CE88-46BF-8A5F-F01174316025",
"nameOfBook": "test",
"nameOfAuthor": "test authou",
}
}
]
}
]
- 来自“用户”table 需要使用 uid
填充“bookHistory”table
- 来自 bookHistory table 需要使用 bookId
填充“书籍”table
可能吗?我正在尝试此代码
const pipeline = [
{ $match: query },
{ $project: projection },
{
$lookup: {
from: 'bookHistory',
localField: 'uid',
foreignField: 'uid',
as: 'bookHistory',
}
},
];
下面是3tables
的样本数据
- 用户table
{
"_id" : "NT-723DD65BE100-444B-B441-2B2804ED7348",
"name" : "AMC",
"uid" : "NT-723DD65BE100-444B-B441-2B2804ED7348",
"updatedBy" : "NT-723DD65BE100-444B-B441-2B2804ED7348",
"updatedOn" : ISODate("2021-10-22T02:45:31.320+0000"),
}
- 书史
{
"_id" : "SHNH-F10ED64A7F98-480B-8D8F-B7587594FB10",
"bookStocksId" : "SHNC-7D60FF3D3E15-4C43-AB24-7E3EA1C0D79A",
"bookId" : "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
"uid" : "NT-723DD65BE100-444B-B441-2B2804ED7348",
"tookOn" : ISODate("2021-10-31T12:59:24.895+0000"),
"dueOn" : ISODate("2021-11-07T12:59:24.895+0000"),
"addedOn" : ISODate("2021-10-31T12:59:24.895+0000")
}
- 书籍table
{
"_id" : "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
"nameOfBook" : "test",
"nameOfAuthor" : "test authou",
"yearOfPublication" : "1998",
"publication" : "test",
"addedOn" : ISODate("2021-10-27T08:39:00.147+0000")
}
谁能帮我解决这个问题?
只需在 $lookup
从 user
到 bookHistory
[= 的子流水线中执行另一个 $lookup
从 bookHistory
到 books
18=]
db.user.aggregate([
{
"$lookup": {
"from": "bookHistory",
let: {
uid: "$uid"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$$uid",
"$uid"
]
}
}
},
{
"$lookup": {
"from": "books",
"localField": "bookId",
"foreignField": "_id",
"as": "bookDetails"
}
},
{
"$unwind": "$bookDetails"
}
],
"as": "bookHistory"
}
}
])
这里是Mongo playground供大家参考。
我是 mongoDB 的新手。也许这是一个简单的问题。请帮我解决这个问题。
要在填充值中填充的 mongo 查询是什么?
有 3 个 tables 用户,bookHistory 和 books。我需要在所有三个中查找。
这就是我需要的结构。
"userList": [
{
"_id": "NT-723DD65BE100-444B-B441-2B2804ED7348",
"name": "AMC",
"uid": "NT-723DD65BE100-444B-B441-2B2804ED7348",
"bookHistory": [
{
"_id": "SHNH-06E723698ED8-420F-AB6D-6574633F5984",
"bookStocksId": "SHNC-4559F09A7F4B-4508-9F61-2A2CD248D3F9",
"bookId": "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
"uid": "NT-723DD65BE100-444B-B441-2B2804ED7348",
"bookDetails": {
"_id": "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
"nameOfBook": "test",
"nameOfAuthor": "test authou",
}
},
{
"_id": "617e6c068bf26821f955b034",
"bookStocksId": "SHNC-694DF63AE953-40A8-B49B-71E46D0A9463",
"bookId": "SHN-5B5A2712CE88-46BF-8A5F-F01174316025",
"uid": "NT-723DD65BE100-444B-B441-2B2804ED7348",
"bookDetails": {
"_id": "SHN-5B5A2712CE88-46BF-8A5F-F01174316025",
"nameOfBook": "test",
"nameOfAuthor": "test authou",
}
}
]
}
]
- 来自“用户”table 需要使用 uid 填充“bookHistory”table
- 来自 bookHistory table 需要使用 bookId 填充“书籍”table
可能吗?我正在尝试此代码
const pipeline = [
{ $match: query },
{ $project: projection },
{
$lookup: {
from: 'bookHistory',
localField: 'uid',
foreignField: 'uid',
as: 'bookHistory',
}
},
];
下面是3tables
的样本数据- 用户table
{ "_id" : "NT-723DD65BE100-444B-B441-2B2804ED7348", "name" : "AMC", "uid" : "NT-723DD65BE100-444B-B441-2B2804ED7348", "updatedBy" : "NT-723DD65BE100-444B-B441-2B2804ED7348", "updatedOn" : ISODate("2021-10-22T02:45:31.320+0000"), }
- 书史
{ "_id" : "SHNH-F10ED64A7F98-480B-8D8F-B7587594FB10", "bookStocksId" : "SHNC-7D60FF3D3E15-4C43-AB24-7E3EA1C0D79A", "bookId" : "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850", "uid" : "NT-723DD65BE100-444B-B441-2B2804ED7348", "tookOn" : ISODate("2021-10-31T12:59:24.895+0000"), "dueOn" : ISODate("2021-11-07T12:59:24.895+0000"), "addedOn" : ISODate("2021-10-31T12:59:24.895+0000") }
- 书籍table
{ "_id" : "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850", "nameOfBook" : "test", "nameOfAuthor" : "test authou", "yearOfPublication" : "1998", "publication" : "test", "addedOn" : ISODate("2021-10-27T08:39:00.147+0000") }
谁能帮我解决这个问题?
只需在 $lookup
从 user
到 bookHistory
[= 的子流水线中执行另一个 $lookup
从 bookHistory
到 books
18=]
db.user.aggregate([
{
"$lookup": {
"from": "bookHistory",
let: {
uid: "$uid"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$$uid",
"$uid"
]
}
}
},
{
"$lookup": {
"from": "books",
"localField": "bookId",
"foreignField": "_id",
"as": "bookDetails"
}
},
{
"$unwind": "$bookDetails"
}
],
"as": "bookHistory"
}
}
])
这里是Mongo playground供大家参考。