Node.js 如何在MongoDB聚合中查找内部查找?
我有一个简单的3集。这是他们的伪代码。我想得到所有的货物,对于每一批货物,我想有该批货物的所有出价,在每个出价中,我需要userDetails对象Node.js 如何在MongoDB聚合中查找内部查找?,node.js,database,mongodb,mongoose,Node.js,Database,Mongodb,Mongoose,我有一个简单的3集。这是他们的伪代码。我想得到所有的货物,对于每一批货物,我想有该批货物的所有出价,在每个出价中,我需要userDetails对象 User: { name: string, } Shipment: { from: string, to: string } Bid: { amount: number, shipmentId: Ref_to_Shipment userId: Ref_to_User } 这就是我尝试过的: const shipments
User: {
name: string,
}
Shipment: {
from: string,
to: string
}
Bid: {
amount: number,
shipmentId: Ref_to_Shipment
userId: Ref_to_User
}
这就是我尝试过的:
const shipments = await ShipmentModel.aggregate([
{
$lookup: {
from: "bids",
localField: "_id",
foreignField: "shipmentId",
as: "bids"
}
},
{
$lookup: {
from: "users",
localField: "bids.userId",
foreignField: "_id",
as: "bids.user"
}
}
])
我得到了以下结果:
[
{
"_id": "5fad2fc04458ac156531d1b1",
"from": "Belgrade",
"to": "London",
"__v": 0,
"bids": {
"user": [
{
"_id": "5fad2cdb4d19c80d1b6abcb7",
"name": "Amel",
"email": "Muminovic",
"password": "d2d2d2",
"__v": 0
}
]
}
}
]
我正试图得到他们的出价和出价内的用户所有装运数据应类似于:
[
{
"_id": "5fad2fc04458ac156531d1b1",
"from": "Belgrade",
"to": "London",
"__v": 0,
"bids": [
{
"_id": "5fad341887c2ae1feff73402",
"amount": 400,
"userId": "5fad2cdb4d19c80d1b6abcb7",
"shipmentId": "5fad2fc04458ac156531d1b1",
"user": {
"name": "Amel",
}
"__v": 0
}
]
}
]
请尝试使用以下代码:
const shipments = await ShipmentModel.aggregate([
{
$lookup: {
from: "bids",
localField: "_id",
foreignField: "shipmentId",
as: "bids"
}
},
{
$unwind: {
path: "$bids",
preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "users",
localField: "bids.userId",
foreignField: "_id",
as: "bids.user"
}
}
])
如果要防止空数组和空数组,请设置
preserveNullAndEmptyArrays: false
尝试查询并检查是否有效,行为是否符合您的预期:
db.shipping.aggregate([
{
$lookup:{
从:“投标”,
localField:“id”,
foreignField:“shipmentId”,
as:“投标”
}
},
{
$lookup:{
发件人:“用户”,
localField:“id”,
外域:“id”,
as:“新手”
}
},
{
$项目:{
“newBids.id”:0,
“newBids.\u id”:0,
}
},
{
$match:{
“bids.userId”:1
}
},
{
$addFields:{
“新手”:{
“$arrayElemAt”:[
“$newBids”,
0
]
}
}
},
{
$set:{
“bids.user”:“$newBids”
}
},
{
$项目:{
“newBids”:0
}
}
])
此查询执行双重$lookup
,然后执行$project
以删除不需要的字段,并查找用户ID
以添加字段用户
。当$lookup
生成数组时,需要使用arrayElemAt
获取第一个位置
然后,$set
此值作为出价生成到对象中。用户
并删除旧值
请注意,我使用了一个新字段
id
,而不是\u id
,以便更轻松地读取数据。这样,我就可以为每一次无意中的出价获得发货。我可以有10个出价在一批货,所以我会得到10批货与出价作为对象,而不是数组?