Как использовать $lookup, если localField является массивом?

#node.js #mongodb #mongoose #mongodb-query

#node.js #mongodb #мангуст #mongodb-запрос

Вопрос:

у меня есть схема пользователя и схема post .. в пользовательской схеме есть поле массива «posts», которое ссылается на схему post, а в пользовательской схеме содержится поле массива «followings», ссылающееся на схему пользователя.. Это схема пользователя

 const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    //required: true
  },
  email: {
    type: String,
    //required: true
  },
  dob: {
    type: Date,
    //required: true
  },
  username: {
    type: String,
    //required: true
  },
  posts :[
  {type: mongoose.Schema.Types.ObjectId,ref:'Post'}
],
  password: {
    type: String,
   // required: true
  },
  
  followers: [{
    type: mongoose.Schema.Types.ObjectId , ref:'User'
  }],
  following:  [{
    type: mongoose.Schema.Types.ObjectId , ref:'User'
  }]
    
});
  

и схема post

 const PostSchema = new mongoose.Schema({
    body: {
        type: String
    },
    topic: {
        type: mongoose.Schema.Types.ObjectId, ref: 'Topics'
    },
    title: {
        type: String
    },
    createdBy:{
        type: mongoose.Schema.Types.ObjectId, ref: 'User'
    
    },
     createdAt: {
        type: Date,
        default: Date.now()
     },
     comments:[{
        type: mongoose.Schema.Types.ObjectId , ref:'Comment' 
     }],
     updatedAt:{
         type: Date,
         default: Date.now()
     }
});

  

я застрял на том, как запрашивать mongoose для всех сообщений пользователей, за которыми он следит,
как мне запросить все сообщения пользователей, спасибо

Ответ №1:

Используйте агрегатную функцию.

  1. отфильтруйте результат для пользователя, используя $match .
  2. $ размотайте «следующее» поле (поскольку локальное поле не может быть массивом на следующем этапе).
  3. найдите записи, используя $lookup
  4. очистите свой вывод с помощью $project.

решение должно быть примерно таким (не тестировалось):

 db.users.aggregate([
   {
      "$match":{
         "username":"user_username"
      }
   },
   {
      "$unwind":"$following"
   },
   {
      "$lookup":{
         "from":"posts",
         "localField":"following",
         "foreignField":"createdBy",
         "as":"posts"
      }
   },
   {
      "$project":{
         "posts":1,
         "following":1,
         "_id":0
      }
   }
])