Заполните значения из разных моделей - Коллекции Mongoose / MongoDB - NodeJS - PullRequest
0 голосов
/ 31 марта 2020

У меня есть две основные схемы в моем проекте, Store и User.

  • Пользователь Коллекция, отображаемая в MongoDB Compass, выглядит следующим образом:

    _id : ObjectId("**5e830006c4cec2586875124b**")  
    hearts : Array  
    storeID : Array  
    email : "test@test.com"  
    name : "My name is Test"  
    photo : "fa75fa97-c5d8-4e63-a9ee-38441774a26e.jpeg"  
    slugAuthor : "my-name-is-test"  
    description : "My description is Test"  
    hash : "b841b82dcffdd0d517b5010d9ff2047ab447751a4e6dd573f9d55af..."  
    salt : "2bb0f785b134af11d7ca08d4086801fd880626498fbcf106c0df9a66"  
    __v : 0  
    
  • Магазин коллекция, как показано в MongoDB Compass, выглядит следующим образом:

    _id : ObjectId("5e830050c4cec2586875124c")  
    tags : Array  
    name : "My activity is Test"  
    description : "My description us Test"  
    participants : 1  
    duree : 1  
    date : 2220-02-22T21:02:00.000+00:00  
    author : ObjectId("**5e830006c4cec2586875124b**")  
    created : 2020-03-31T08:33:20.234+00:00  
    slug : "my-activity-is-test"  
     __v : 0
    

Что мне нужно :

Когда я отображаю информацию о пользователе Я также хочу искать в каждом Магазине, который он создал.
Как видите, идентификатор пользователя находится в коллекции Магазина (author: ObjectId).

Мне нужно отобразить эту информацию (Пользователь + список магазинов который принадлежит Пользователю), когда я вхожу в маршрут http://..../store/my-name-is-test/5e830006c4cec2586875124b. В моем маршруте мне нужно отобразить как slugAuthor и «author: ObjectId». (это уже удалось).

То, что я уже пробовал (используя .populate ()):

В моей схеме магазина:

author: {
        type: mongoose.Schema.ObjectId,
        ref: 'User', 
    }

В моей пользовательской схеме:

listStores: [{
    type: mongoose.Schema.ObjectId,
    ref: 'Store'}], 

В моем контроллере:

exports.myProfil = async (req, res) => {
        const user = await User.findOne({slugAuthor: req.params.slugAuthor}).populate('listStores') 
        res.render('my-profil', {user}); 
    };  

Это дает мне доступ к следующим данным:

{
  "hearts": [],
  "listStores": [],
  "_id": "5e830006c4cec2586875124b",
  "email": "test@test.com",
  "name": "My name is Test",
  "photo": "fa75fa97-c5d8-4e63-a9ee-38441774a26e.jpeg",
  "slugAuthor": "my-name-is-test",
  "description": "My description is Test",
  "__v": 0
}

Как видите, массив "listStores" пусто, но мне нужно заполнить все магазины, созданные этим пользователем.

Пожалуйста, будьте любезны помочь мне здесь,
Большое спасибо

1 Ответ

0 голосов
/ 31 марта 2020

Вы можете использовать агрегацию для этого. Взгляните на lookup

   $lookup:
     {
       from: 'Store',
       localField: _id, // the _id of the user
       foreignField: author,
       as: "listStores" // this might be something else
     }

В этом случае вместо поиска вам нужно использовать User.aggregate

Надеюсь, это поможет!

...