问题描述
我希望在我的猫鼬模式中有字段 contractType,它是一个对象数组,每个对象都将 authorizedBy 属性放入第二级。
contractType 字段可能有很多项,我想知道每个 authorizedBy 在其他名为 admins 的集合中找到它(我会下面也是)。
const professionalSchema = new Schema(
firstName: String,contractType: [
new Schema(
{
contract: String,authorizedBy: {
type: ObjectId,ref: 'admin',index: true,},document: String
},{
timestamps: true,versionKey: false,),],)
这是我的管理员收藏。
const adminSchema = new Schema(
{
firstName: String,lastName: String,role: String
},{
timestamps: true,)
我在 professionalSchema mongodb compass 中有这个:
{
"_id": ObjectId("6009a0d0874f0900086ee0ce"),"firstName": "xxxx","gender": "NOT_SPECIFIED","contractType": [
{
"authorizedBy": ObjectId("5fad90665d963cbbbd4a6580"),"document": "document 1"
},{
"authorizedBy": ObjectId("5fad90665d963cbbbd4a6580"),"document": "document 2"
}
]
}
{
"_id": ObjectId("5fad90665d963cbbbd4a6580"),"role": "SAM","firstName": "firstname","lastName": "lastname"
}
我会得到像下面这样的响应,另外我想获取对象的所有字段(20 aprox),而不是手动添加每个字段,例如 javascript 中的扩展运算符(...item)
{
"_id": ObjectId("6009a0d0874f0900086ee0ce"),"contractType": [
{
"authorizedBy": {
"_id": "5fad90665d963cbbbd4a6580","lastName": "lastname","role": "SAM"
},{
"authorizedBy": {
"_id": "5fad90665d963cbbbd4a6580","document": "document 2"
}
]
}
我在 mongo compass 中试过这个。
[
{
'$match': {
'_id': new ObjectId('6009a0d0874f0900086ee0ce')
}
},{
'$unwind': {
'path': '$contractType'
}
},{
'$lookup': {
'from': 'admins','localField': 'contractType.authorizedBy','foreignField': '_id','as': 'contractType.authorizedBy'
}
},{
'$unwind': {
'path': '$contractType.authorizedBy'
}
},{
$group': {
'_id': '$_id'
}
}
]
但我不知道如何将其余元素(大约 20 个)放在同一个对象中:(
解决方法
你所做的几乎是正确的,
db.professionalSchema.aggregate([
{"$match": {"_id": ObjectId("6009a0d0874f0900086ee0ce") } },{"$unwind": {"path": "$contractType" }},{
"$lookup": {
"from": "adminSchema","localField": "contractType.authorizedBy","foreignField": "_id","as": "contractType.authorizedBy"
}
},{
"$addFields": {
"contractType.authorizedBy": {
$ifNull: [
{ $arrayElemAt: [ "$contractType.authorizedBy",0 ] },""
]
}
}
},{
"$group": {
"_id": "$_id","firstName": { $first: "$firstName" },"gender": { $first: "$gender"},contractType: { $push: "$contractType" }
}
}
])