如何填充猫鼬集合的嵌套对象?

时间:2020-06-29 14:18:16

标签: node.js mongodb express mongoose populate

我正在研究其RESTful API的问答网站,我就此问题进行了讨论。如果有人帮助我,我将很感激,我是Node.js和Express.js的新人。

这是MongoDB问题模式:

const QuestionSchema = new Schema({
  slug: {
    type: String,
    required: true,
  },
  author: {
    type: Schema.Types.ObjectId,
    ref: "User",
  },
  title: {
    type: String,
    required: true,
  },
  body: {
    type: String,
    required: true,
  },
  date: { type: String, required: true },
  status: {
    type: String,
    required: true,
  },
  category: {
    type: Schema.Types.ObjectId,
    ref: "Category",
  },
  bookmarked: Boolean,
  comments: {
    type: Schema.Types.ObjectId,
    ref: "Comment",
  },
});

这是数据示例:

{
    "_id" : ObjectId("5ef8c312731f9c10f407defb"),
    "slug" : "question2",
    "title" : "چه نام‌هایی باعث افزایش برکت در خانه می‌شوند؟",
    "body" : "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است، و برای شرایط فعلی تکنولوژی مورد نیاز، و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد، کتابهای زیادی در شصت و سه درصد گذشته حال و آینده، شناخت فراوان جامعه و متخصصان را می طلبد، تا با نرم افزارها شناخت بیشتری را برای طراحان رایانه ای علی الخصوص طراحان خلاقی، و فرهنگ پیشرو در زبان فارسی ایجاد کرد، در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها، و شرایط سخت تایپ به پایان رسد و زمان مورد نیاز شامل حروفچینی دستاوردهای اصلی، و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.",
    "date" : "28/june/2020",
    "status" : "1",
    "bookmarked" : false,
    "category" :ObjectId("5ef8be8204fe40030cf911ef"),
    "author" : ObjectId("5ef8bcf63f2b47099ca117ef"),
    "__v" : 0,
    "comments" : [ 
        ObjectId("5ef8c44423f04831e41f14d3"), 
        ObjectId("5ef8c46323f04831e41f14d4"), 
        ObjectId("5ef8c52f2ffd6929e09d10dd"), 
        ObjectId("5ef8c52f2ffd6929e09d10de"), 
        ObjectId("5ef8c5302ffd6929e09d10df"), 
        ObjectId("5ef8c57b2ffd6929e09d10e0"), 
        ObjectId("5ef8c5852ffd6929e09d10e1")
    ]
}

这是服务器端获取所有问题的代码:

// Route to get all questions
app.get("/questions", function (req, res) {
  db.Question.find({})
    .populate("author category comments")
    .then(function (dbQuestions) {
      res.json(dbQuestions);
    })
    .catch(function (err) {
      res.json(err);
    });
});

作为回应,我没有得到所有的Questions Comments数据,只是它显示了comment数组的第一个元素,如下所示:

{
        "_id": "5ef8c312731f9c10f407defb",
        "slug": "question2",
        "title": "چه نام‌هایی باعث افزایش برکت در خانه می‌شوند؟",
        "body": "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است، و برای شرایط فعلی تکنولوژی مورد نیاز، و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد، کتابهای زیادی در شصت و سه درصد گذشته حال و آینده، شناخت فراوان جامعه و متخصصان را می طلبد، تا با نرم افزارها شناخت بیشتری را برای طراحان رایانه ای علی الخصوص طراحان خلاقی، و فرهنگ پیشرو در زبان فارسی ایجاد کرد، در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها، و شرایط سخت تایپ به پایان رسد و زمان مورد نیاز شامل حروفچینی دستاوردهای اصلی، و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.",
        "date": "28/june/2020",
        "status": "1",
        "bookmarked": false,
        "category": {
        "_id": "5ef8be8204fe40030cf911ef",
        "title": "زکات",
        "__v": 0
        },
        "author": {
        "_id": "5ef8bcf63f2b47099ca117ef",
        "firstName": "خالد",
        "lastName": "صمدی",
        "userAvatar": "./images/avatars/2.jpg",
        "__v": 0
        },
        "__v": 0,
            "comments": {  //here is showing only single element of array 
            "_id": "5ef8c44423f04831e41f14d3",
            "Body": "شرح نظریه اینجا نویشته میگردد که دارای متن مفصل میباشد",
            "author": "5ef8bd2e3f2b47099ca117f0",
            "date": "20/10/2020",
            "__v": 0
            }
}

我希望得到我的问题。

2 个答案:

答案 0 :(得分:0)

这就是您所缺少的:

comments: [{
  type: Schema.Types.ObjectId,
  ref: "Comment",
}],

该引用需要包裹在[]中,以告诉Mongoose这是一个注释数组,而不是单个注释。

答案 1 :(得分:0)

错误在于您定义的架构。 由于您将要存储ObjectID数组,因此在数组中还要提及架构。

以此替换“评论”定义。它将起作用。

comments: [{ type: Schema.Types.ObjectId, ref: "Comment", }]