Запрос ссылочного документа в MongoDB с использованием Mongoose - PullRequest
0 голосов
/ 03 декабря 2018

Это документ в коллекции BlogPosts:

{
    _id: ObjectId("..."),
    post_title: "Hello World!",
    post_body: "",
    comments: [
        { user_id: ObjectId("123"), body: "nice post!" },
        { user_id: ObjectId("456"), body: "awesome!" },
    ]
}

Я хотел бы отобразить комментарии с именем пользователя, которое содержится в указанном документе в коллекции Users:

{
    _id: ObjectId("123"),
    first_name: "Marion",
    last_name: "Smith",
    email_address: "marion@example.com",
    password: "..."
}

Есть ли способ извлечь документ BlogPosts, включая first_name из этих данных?

Например, я ищу вывод, подобный этому (каждый комментарийимеет имя):

{
    _id: ObjectId("..."),
    post_title: "Hello World!",
    post_body: "",
    comments: [
        { user_id: ObjectId("..."), first_name: "Marion",  body: "nice post!" },
        { user_id: ObjectId("..."), first_name: "Margaret", body: "awesome!" },
    ]
}

Я использую Mongoose.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

С тех пор я нашел более простой подход, использующий просто Заполнить .

BlogPosts
    .findOne({_id: req.params.id})
    .populate('comments.user_id', ['first_name', 'last_name'])
    .then(post => console.log(post))

В схеме для BlogPosts должно быть определено ref для comments.user_idполе:

const User = require('./User.model.js');

const blogPostSchema = new Schema({
    post_title: { type: String },
    post_body: { type: String },
    comments: [{
        user_id: {
            type: Schema.ObjectId,
            ref: 'User'  <-------- here
        }
    }]
});

const BlogPost = mongoose.model('BlogPost', blogPostSchema);

module.exports = BlogPost;
0 голосов
/ 03 декабря 2018

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$unwind": "$comments" },
  { "$lookup": {
    "from": "users",
    "let": { "userId": "$comments.user_id" },
    "pipeline": [{ "$match": { "$expr": { "$eq": ["$$userId", "$_id"] } } }],
    "as": "user"
  }},
  { "$addFields": {
    "comments.first_name": { "$arrayElemAt": ["$user.first_name", 0] }
  }},
  { "$group": {
    "_id": "$_id",
    "comments": { "$push": "$comments" },
    "post_title": { "$first": "$post_title" },
    "post_body": { "$first": "$post_body" }
  }}
])
...