Можно ли получить все данные о населении в мангусте с идентификаторами? - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь создать запрос в моей конечной точке API, который выбирает все документы и вложенные документы. В настоящее время мне посчастливилось получить идентификаторы каждого вложенного документа, а не всю информацию в каждом документе. Можно ли извлечь данные из каждого вложенного документа на основе каждого идентификатора, используя mongoose (вместе с данными в родительском документе)?

Я следовал документации для глубокого заполнения: https://mongoosejs.com/docs/populate.html#deep-populate,, но мне не повезло.

Это мой текущий код, который «работает», но отвечает только идентификаторами каждого вложенного документа ( и пользовательскими данными, которые подходят ).


//The get request
router.get("/allUsers", async (req, res) => {
  const allUsers = await User.find()
    .populate("Post")
    .exec();
  res.send(allUsers);
});

//User Schema
const userSchema = Schema({
  name: { type: String, required: true },
  date: { type: Date, default: Date.now },
  posts: [{ type: Schema.Types.ObjectId, ref: "Post" }]
});

//Post Schema
const postSchema = new mongoose.Schema({
  name: { type: String, required: true },
  description: { type: String, required: true }
  date: { type: Date, default: Date.now }
});

Чего мне не хватает, чтобы извлечь ВСЕ данные из поддокументов вместо одного идентификатора?

Ответы [ 3 ]

1 голос
/ 09 ноября 2019

Передайте имя поля populate, а не название модели:

const allUsers = await User.find()
  .populate("posts")
  .exec();
0 голосов
/ 09 ноября 2019

Как сказал ДжонниХК, для заполнения необходимо использовать имя поля.

Если у вас пустой массив сообщений, проверьте свою коллекцию пользователей, если у вас есть массив сообщений с идентификаторами сообщений.

Вот шаги, которые я мог бы заставить его работать:

1-) Вставил 2 сообщения, подобные этой, в коллекцию сообщений.

{
    "_id" : ObjectId("5dc6cd65067a61191839ff38"),
    "name" : "name 3",
    "description" : "description 3",
    "date" : ISODate("2019-11-09T17:29:57.249+03:00")
}
{
    "_id" : ObjectId("5dc6cd5d067a61191839ff37"),
    "name" : "name 2",
    "description" : "description 2",
    "date" : ISODate("2019-11-09T17:29:49.070+03:00")
}

2-) Вставил пользователя сэти 2 сообщения id.

{
    "_id" : ObjectId("5dc6cf5b67da8a40cc519866"),
    "posts" : [
        ObjectId("5dc6cd5d067a61191839ff37"),
        ObjectId("5dc6cd65067a61191839ff38")
    ],
    "name" : "user 1",
    "date" : ISODate("2019-11-09T17:38:19.807+03:00")
}

3-) И использовали следующий маршрут для получения сообщений от пользователя.

router.get("/allUsers", async (req, res) => {
  const allUsers = await User.find().populate("posts");

  res.send(allUsers);
});

Результат примерно такой:

[
    {
        "posts": [
            {
                "_id": "5dc6cd5d067a61191839ff37",
                "name": "name 2",
                "description": "description 2",
                "date": "2019-11-09T14:29:49.070Z",
                "__v": 0
            },
            {
                "_id": "5dc6cd65067a61191839ff38",
                "name": "name 3",
                "description": "description 3",
                "date": "2019-11-09T14:29:57.249Z",
                "__v": 0
            }
        ],
        "_id": "5dc6cf5b67da8a40cc519866",
        "name": "user 1",
        "date": "2019-11-09T14:38:19.807Z",
        "__v": 0
    }
]

Кстати ваш пользователь и пост-моделирование не идеальны. Каждый раз, когда пользователь публикует пользовательский документ, он должен обновляться.

Я бы использовал следующие схемы (родительские ссылки).

Модель пользователя (я удалил поле сообщений и добавил виртуальную функцию)

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  date: { type: Date, default: Date.now }
}, {
  toJSON: { virtuals: true },
  toObject: { virtuals: true }
});

userSchema.virtual("posts", {
  ref: "Post",
  foreignField: "userId",
  localField: "_id"
})

const User = mongoose.model("User", userSchema);

module.exports = User;

Опубликовать модель (я добавил userId)

const mongoose = require("mongoose");

const postSchema = new mongoose.Schema({
    name: { type: String, required: true },
    description: { type: String, required: true },
    date: { type: Date, default: Date.now },
    userId: { type: mongoose.Schema.ObjectId, ref: "User" }
});

const Post = mongoose.model("Post", postSchema);

module.exports = Post;

Таким образом, пользовательский документ не затрагивается, когда пользователь публикует сообщения. И вы можете использовать тот же маршрут / allUsers, чтобы получать пользователей с включенными в них сообщениями.

0 голосов
/ 09 ноября 2019

использовать заполнить внутри другого заполнения

.populate({
      path: 'document',
      populate: { path: 'sub document'}
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...