Заполнение нескольких уровней не работает - PullRequest
0 голосов
/ 24 марта 2019

У меня есть модель блога, в которой есть несколько комментариев и несколько ответов.Я хочу пройтись по всем из них, и с моим кодом я смог получить доступ только к первым 2 слоям.

Это в моей БД в качестве объектов комментариев:

{ "_id" : ObjectId("5c9770fc0147e40f1c53aab8"), "comments" : [ ObjectId("5c97734db48ab60f6139ffa3") ], "author" : ObjectId("5c9770e60147e40f1c53aab5"), "text" : "comment", "__v" : 1 }
{ "_id" : ObjectId("5c97734db48ab60f6139ffa3"), "comments" : [ ObjectId("5c977a169f98a8106dc0dc5c") ], "text" : "2", "__v" : 1 }
{ "_id" : ObjectId("5c977a169f98a8106dc0dc5c"), "comments" : [ ], "text" : "3", "__v" : 0 }
{ "_id" : ObjectId("5c977b3b3a5bb410ce7e0e70"), "comments" : [ ObjectId("5c977b533a5bb410ce7e0e71") ], "author" : ObjectId("5c9770e60147e40f1c53aab5"), "text" : "1", "__v" : 1 }
{ "_id" : ObjectId("5c977b533a5bb410ce7e0e71"), "comments" : [ ObjectId("5c977b6f3a5bb410ce7e0e73") ], "author" : ObjectId("5c9770e60147e40f1c53aab5"), "text" : "2", "__v" : 1 }
{ "_id" : ObjectId("5c977b6f3a5bb410ce7e0e73"), "comments" : [ ], "author" : ObjectId("5c9770e60147e40f1c53aab5"), "text" : "3", "__v" : 0 }

Схема комментариев:

var commentSchema = new mongoose.Schema({
    author: {
          type: mongoose.Schema.Types.ObjectId,
          ref: "User"
    },
    text: String,
    comments: [{
        type: mongoose.Schema.Types.ObjectId, 
        ref: "Comment"
    }]
});

Объект блога:

{ "_id" : ObjectId("5c9770ee0147e40f1c53aab6"), "comments" : [ ObjectId("5c9770fc0147e40f1c53aab8"), ObjectId("5c977b3b3a5bb410ce7e0e70") ], "title" : "title", "image" : "", "text" : "text", "author" : ObjectId("5c9770e60147e40f1c53aab5"), "date" : ISODate("2019-03-24T11:58:38.227Z"), "__v" : 2 }

Схема блога:

var blogSchema = new mongoose.Schema({
    title: String,
    author: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User"
    },
    date: ({type: Date, default: Date.now}),
    text: String,
    image: String,
    comments: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: "Comment"
    }]
})

Вот мой маршрут

router.get("/:id",function(req,res){
    Blog.findById(req.params.id)
    .populate("author")
    .populate({
        path: "comments",
        model: "Comment",
        populate: {
            path: "comments",
            model: "Comment"
        }
    })
    .exec(function(err,blog){
        if (err) console.log(err);

        res.render("../views/blogs/show",{blog: blog});
    })
});

И вотчто я получаю при печати блога:

{ comments: [ { comments: [Array], _id: 5c97734db48ab60f6139ffa3, text: '2', __v: 1 } ], _id: 5c9770fc0147e40f1c53aab8, author: 5c9770e60147e40f1c53aab5, text: 'comment', __v: 1 },{ comments: [ { comments: [Array], _id: 5c977b533a5bb410ce7e0e71, author: 5c9770e60147e40f1c53aab5, text: '2', __v: 1 } ], _id: 5c977b3b3a5bb410ce7e0e70, author: 5c9770e60147e40f1c53aab5, text: '1', __v: 1 }

Как мне заполнить все вложенные массивы объектов комментариев?

1 Ответ

1 голос
/ 25 марта 2019

Там не является прямой поддержкой для извлечения потенциально бесконечных вложенных объектных ссылок (Comment-> Comment-> Comment -> ...). Это очевидно из соображений производительности.

Плагин mongoose для глубоко заполненных вложенных моделей существует, так что вы можете легко сделать это, используя код, подобный следующему:

const deepPopulate = require('mongoose-deep-populate')(mongoose);
blogSchema.plugin(deepPopulate, {}); //<- {} empty options

// ...

Blog.findById(req.params.id)
.populate('author')
.deepPopulate('comments.user')
.exec(function (err, blog) {
    if (err) console.log(err);
    res.render("../views/blogs/show",{blog: blog});
});

Пожалуйста, прочитайте readme для получения многих полезных сведений о плагине и имейте в виду, что глубокое заполнение может быть действительно неэффективным и что вы можете ограничить глубокое Популяция, используя параметры плагина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...