填充来自另一个集合猫鼬的数据

时间:2019-09-09 18:52:11

标签: node.js mongodb mongoose

我有3个收藏夹用户,个人资料和受信任的联系人。个人资料和受信任的联系人已向用户推荐

我的数据库集合

我有收藏用户

{
    "_id": {
        "$oid": "5c5ecaf6134fc342d4b1a9d5"
    },
    "name": "User",
    "email": "user@gmail.com",
    "password": "$2a$10$BXxwpMTFK1a0aWclaqJYve4f3SZyi/emwHKv5rY2GNzrPSEsIJhzi",
},
{
    "_id": {
        "$oid": "5c64968cae53a8202c963223"
    },
    "name": "User1",
    "email": "user1@gmail.com",
    "password": "$2a$10$BXxwpMTFK1a0aWclaqJYve4f3SZyi/emwHKv5rY2GNzrPSEsIJhzi",
},
{
    "_id": {
        "$oid": "5c69968cae53a8202c963554"
    },
    "name": "User1",
    "email": "user1@gmail.com",
    "password": "$2a$10$BXxwpMTFK1a0aWclaqJYve4f3SZyi/emwHKv5rY2GNzrPSEsIJhzi",
}

收藏档案

{
    "_id": {
        "$oid": "5c5ecb17134fc342d4b1a9d6"
    },
    "user": {
        "$oid": "5c5ecaf6134fc342d4b1a9d5"
    },
    "handle": "handle",
    "company": "test"
},
{
    "_id": {
        "$oid": "5c6496ebae53a8202c963224"
    },
    "user": {
        "$oid": "5c64968cae53a8202c963223"
    },
    "handle": "handle1",
    "company": ""
},
{
    "_id": {
        "$oid": "5c6496ebae53a8202c963224"
    },
    "user": {
        "$oid": "5c69968cae53a8202c963554"
    },
    "handle": "handle2",
    "company": ""
}

收集信任的联系人


{
    "_id": {
        "$oid": "5d76008e4b98e63e58cb34cc"
    },
    "approvedTrustedContacts": [
        {
            "_id": {
                "$oid": "5d764e411b7476462cf6b540"
            },
            "user": {
                "$oid": "5c5ecaf6134fc342d4b1a9d5"
            }
        },
        {
            "_id": {
                "$oid": "5d764e411b7476462cf6b541"
            },
            "user": {
                "$oid": "5c64968cae53a8202c963223"
            }
        }
    ],
    "pendingApprovalContacts": [],
    "waitingForApprovalContacts": [],
    "user": {
        "$oid": "5d76008e4b98e63e58cb34cb"
    }
}

//我的模式

const UserSchema = new mongoose.Schema({
  name: {
    type: String,
  },
  email: {
    type: String,
  }
});
export default mongoose.model('User', UserSchema);

const ProfileSchema = new mongoose.Schema({
 user: {
   type: mongoose.Schema.Types.ObjectId,
   ref: 'User'
 },
  handle: {
   type: String,
  },
  company: {
   type: String,
  },
});

export default mongoose.model('Profile', ProfileSchema);
import mongoose from 'mongoose';

const TrustedContactsSchema = new mongoose.Schema({
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  },
  approvedTrustedContacts: [
    {
      user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
      }
    }
  ],
  ...
});

export default mongoose.model('TrustedContacts', TrustedContactsSchema);

我可以填充用户信任的联系人

const user = await TrustedContacts.findOne({ user: req.user.id }).populate('approvedTrustedContacts.user', ['name', 'email']);

我知道了

 "user": {
        "date": "2019-09-09T07:32:20.174Z",
        "_id": "5d76008e4b98e63e58cb34cc",
        "approvedTrustedContacts": [
            {
                "_id": "5d764e411b7476462cf6b540",
                "user": {
                    "_id": "5c5ecaf6134fc342d4b1a9d5",
                     "name": "User",
                      "email": "user@gmail.com",
                }
            },
             {
                "_id": "5d764e411b7476462cf6b541",
                "user": {
                    "_id": "5c64968cae53a8202c963223",
                     "name": "User1",
                      "email": "user1@gmail.com",
                }
            }
        ],
        "pendingApprovalContacts": [],
        "waitingForApprovalContacts": [],
        "user": "5d76008e4b98e63e58cb34cb",
    }

预期产量

可以获取带有个人资料数据的认可的受信任联系人列表

"approvedTrustedContacts": [
            {
                "_id": "5d764e411b7476462cf6b540",
                "user": {
                    "_id": "5c5ecaf6134fc342d4b1a9d5",
                     "name": "User",
                      "email": "user@gmail.com",
                },
                 "handle": "handle",
                 "company": "test"
            },
             {
                "_id": "5d764e411b7476462cf6b541",
                "user": {
                    "_id": "5c64968cae53a8202c963223",
                     "name": "User1",
                      "email": "user1@gmail.com",
                },
                "handle": "handle1",
                "company": "test1"
            }
        ],

我也加入了2个这样的收藏

 let result1 = await TrustedContacts.aggregate([
        { $lookup: { from: "profiles", localField: "user", foreignField: "user", as: "approvedTrustedContacts"  } },
      ]);

我知道了

 {
            "_id": "5d76008e4b98e63e58cb34cc",
          "approvedTrustedContacts": [
                {
                    "_id": "5d764f551b7476462cf6b542",
                   "user": "5d76008e4b98e63e58cb34cb",
                    "handle": "handle",
                    "company": "test",
                },
                {
                    "_id": "5c5ecb17134fc342d4b1a9d6",
                    "user": "5c5ecaf6134fc342d4b1a9d5",
                    "handle": "handle1",
                    "company": "test1",
                }
            ],
            "pendingApprovalContacts": [],
            "waitingForApprovalContacts": [],
            "user": "5d76008e4b98e63e58cb34cb",
        }
    ],

现在,我不知道如何污染用户才能获得如下输出:

 {
            "_id": "5d76008e4b98e63e58cb34cc",
          "approvedTrustedContacts": [
                {
                    "_id": "5d764f551b7476462cf6b542",
                  "user": {
                    "_id": "5c5ecaf6134fc342d4b1a9d5",
                     "name": "User",
                      "email": "user@gmail.com",
                },
                    "handle": "handle"
                    "company": "test",
                },
              {
                    "_id": "5c5ecb17134fc342d4b1a9d6",
                   "user": {
                    "_id": "5c64968cae53a8202c963223",
                     "name": "User1",
                      "email": "user1@gmail.com",
                },
                    "handle": "handle1",
                    "company": "test1",
                }
            ],
            "pendingApprovalContacts": [],
            "waitingForApprovalContacts": [],
            "user": "5d76008e4b98e63e58cb34cb",
        }
    ],

1 个答案:

答案 0 :(得分:0)

我的解决方案

let result = await TrustedContacts.aggregate([
        { $lookup: { from: "profiles", localField: "approvedTrustedContacts.user", foreignField: "user", as: "approvedTrustedContacts.profile"  } },
        { $unwind: "$approvedTrustedContacts.profile" },
        { $lookup: { from: "users", localField: "approvedTrustedContacts.profile.user", foreignField: "_id", as: "approvedTrustedContacts.profile.user"  } },
        { $unwind: "$approvedTrustedContacts.profile.user" },
        { $group :{
          _id: "$_id",
            "date": {"$first":  "$date"},
            "approvedTrustedContacts": {"$push":  "$approvedTrustedContacts"},
        }}
      ]);

作为输出,我有

{
            "_id": "5d76008e4b98e63e58cb34cc",
            "date": "2019-09-09T07:32:20.174Z",
            "approvedTrustedContacts": [
                {
                    "profile": {
                        "_id": "5c5ecb17134fc342d4b1a9d6",
                        "skills": [
                            "test"
                        ],
                        "date": "2019-02-09T12:42:48.969Z",
                        "user": {
                            "_id": "5c5ecaf6134fc342d4b1a9d5",
                            "data": "2019-02-09T12:42:48.716Z",
                            "name": "User",
                            "email": "user@gmail.com",
                        },
                        "handle": "handle",
                        "company": "test",
                    }
                },
                {
                    "profile": {
                        "_id": "5c6496ebae53a8202c963224",
                        "skills": [
                            "qwqwqwqwqw"
                        ],
                        "date": "2019-02-13T22:11:04.119Z",
                        "user": {
                            "_id": "5c64968cae53a8202c963223",
                            "data": "2019-02-13T22:11:03.807Z",
                            "name": "User1",
                            "email": "user1@gmail.com",
                        },
                        "handle": "handle1",
                        "company": "test1",
                    }
                }
            ]
        }
    ```