mongodb 尝试通过动态选择模型来填充对象数组中每个对象的单个字段,以便与mongoose一起使用

fhg3lkii  于 2023-01-01  发布在  Go
关注(0)|答案(1)|浏览(98)

我尝试使用refPath来引用要从模式中提取人口数据的集合,尽管它看起来与我看到的示例相同,但就是不起作用。
下面是我的statesPersons模式,不是特别重要,但它包含了对象的activeWork数组。

import mongoose, {model, Schema}  from "mongoose";

const statesPersonsSchema = new Schema(
  {
    profileId: {
      type: String,
      required: true,
      unique: true,
    },
    department: {
      type: String,
      required: true,
      index: true,
    },
    firstName: String,
    lastName: String,
    location: String,
    org: String,
    title: String,
    jobDescription: String,
    email: {
      type: String,
      lowercase: true,
    },
    phoneNumber: String,
    activeWork: ["activeWork"],
    emailList: [String],
    jobAssignments: [String],
    affiantInfo: {
      affiantInfoTitle: String,
      affiantInfoExperience: String,
    },
    assessments: [
      {
        assessdBy: {
          type: Schema.Types.ObjectId,
          ref: "statesPerson",
        },
        dueDate: Date,
        questions: {},
      },
    ],
  },
  { strictPopulate: false }
);


export default mongoose.model("statesPersons", statesPersonsSchema);

这是我的activeWork模式,对象数组,其中有需要填充的referenceId,还有collectionType,我从哪个集合中提取它。

import mongoose, {model, Schema}  from "mongoose";

const activeWorkSchema = new Schema(
  {
    active: Boolean,
    collectionType: {
      type: String,
      enum: ["messages", "cases"],
    },
    referenceId: {
      type: Schema.Types.ObjectId,
      refPath: "collectionType",
    },
    sentBy: {
      type: Schema.Types.String,
      ref: "statesPersons",
    },
    sentTo: {
      type: Schema.Types.String,
      ref: "statesPersons",
    },
    timeRecived: Date,
    dueDate: Date,
    subject: String,
    viewed: Boolean,
    content: {},
  },
  { strictPopulate: false }
);

  export default mongoose.model("activeWork", activeWorkSchema);

这是我的疑问。

export async function getStatesPersonsActiveWorkByProfileId(req, res){
    mongoose.set('debug', true);
    try{
        const { profileId } = req.params

        const data = await statesPersons
        .find({ profileId })
        .populate('statesPersons.activeWork.referenceId')
        .exec()
        
        return res.send({
            message: "success",
             data: data,
             status: 200 })
    }catch(e) {
        console.error(e.message)
        return res.send({
            message: "couldn't fetch active work",
             data: null,
             status: 500 })
    }
}

它返回了statesPersons对象,并且activeWork包含了我需要填充的objectId,但它没有填充。它看起来像这样。

"activeWork": [
                {
                    "active": true,
                    "collectionType": "messages",
                    "referenceId": "63a49e3052658ce60c1dafcb",
                    "sentBy": "108416469928574003772",
                    "dueDate": "2018-02-21T11:16:50.362Z",
                    "subject": "testing",
                    "viewed": false,
                    "_id": "63a49e3052658ce60c1dafce"

我可以通过将查询更改为显式来强制它工作。

const data = await statesPersons
        .find({ profileId })
        .populate({path: 'activeWork.referenceId', model: 'messages'})
        .exec()

看起来像这样。

activeWork": [
            {
                    "active": true,
                    "collectionType": "messages",
                    "referenceId": {
                        "_id": "63a49e3052658ce60c1dafcb",
                        "involvedParties": [
                            "108416469928574003772",
                            "100335565301468600000"
                        ],
                        "comments": [
                            {
                                "sender": [
                                    "108416469928574003772"
                                ],
                                "dateSent": "2022-12-22T18:13:04.604Z",
                                "content": "There is no way this is going to work.",
                                "_id": "63a49e3052658ce60c1dafcc"
                            }
                        ],

但这行不通,因为我需要它能够从collectionType字段中提取要使用的模型

u5i3ibmn

u5i3ibmn1#

很抱歉回复太晚,您似乎正在尝试填充多级文档多级填充。
这里有一个例子。

db.statesPersonsSchema.find({ profileId }). populate({
    path: 'activeWorkSchema',
    populate: { path: 'referenceId' }
  });

相关问题