【问题标题】:Populate data from another collection mongoose从另一个集合 mongoose 填充数据
【发布时间】:2019-09-10 17:15:11
【问题描述】:

我有 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列表

"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"
            }
        ],

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

 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",
        }
    ],

【问题讨论】:

  • 由于您的架构类型,在这里您无法使用populate() 实现您的解决方案。

标签: node.js mongodb mongoose


【解决方案1】:

我的解决方案

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",
                    }
                }
            ]
        }
    ```


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2020-01-10
    • 2019-05-26
    • 1970-01-01
    • 2017-03-30
    • 2020-09-10
    • 2013-07-01
    相关资源
    最近更新 更多