как я могу получить значение в populate() в mongoose?

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Я хочу вернуть объект одного индекса массива, но когда я запрашиваю, он возвращает мне все документы.

Это моя схема (userTb)

 const userTbSchema = new Schema({
  _id: mongoose.Schema.Types.ObjectId,
  userId: String,
  gender: String
}
 

И это моя другая схема (продукт)

 const productSchema = new Schema({
  _id: mongoose.Schema.Types.ObjectId,
  product: String,
  userTbId: { type: mongoose.Schema.Types.ObjectId, ref: "userTb", required: true },
}
 

И они находятся в другом файле js.
Это результат запроса моей схемы (продукта), не использующей Populate.

 {
    "_id": "5fc4c13f32ab3174acb01234",
    "product": "watch",
    "userTbId": "5fc4c13f32ab3174acb08540"
},
{
    "_id": "5fc4c2d6b3a2a054d4dc1235",
    "userId": "car",
    "userTbId": "5fc4c2d6b3a2a054d4dc462c"
}
 

И это результат запроса моей схемы (продукта) при использовании Populate.

 {
    "_id": "5fc4c13f32ab3174acb01234",
    "product": "watch",
    "userTbId": {
        "_id": "5fc4c13f32ab3174acb08540",
        "userId": "go05111",
        "gender": "male"
    }
},
{
    "_id": "5fc4c2d6b3a2a054d4dc1235",
    "userId": "car",
    "userTbId": {
        "_id": "5fc4c2d6b3a2a054d4dc462c",
        "userId": "Chips",
        "gender": "female"
    }   
}
 

Я хочу получить единственный объект { «пол»: «мужской»} в proudct, например…

 {
    "_id": "5fc4c13f32ab3174acb01234",
    "product": "watch",
    "userTbId": {
        "_id": "5fc4c13f32ab3174acb08540",
        "userId": "go05111",
        "gender": "male"
    }
}
 

итак, я запрашиваю следующим образом

 router.get('/:gender', (req, res, next) => {
    Product.find({
        "userTbId.gender": req.params.gender
    })
    .populate({
        path: 'userTbId',
        match: {
            userId: req.params.userId
        }
    })
    .exec()
    .then(docs => {
        res.status(200).json({
            docs
        }); 
    })
    .catch(err => {
        res.status(500).json({
            error: err
        });
    });
});
 

но в результате ничего не возвращается.

Я думаю, что userTbId является ObjectId , поэтому, даже если используется populate() , значение не отображается при использовании find() .

Я пробовал несколько разных способов, но это не сработало, что я хочу.

как я могу это исправить в mongoose?

не могли бы вы мне помочь?

Ответ №1:

В mongoose функция populate будет выполняться для результирующего набора из запроса find. В вашей схеме продукта userTbId — это идентификатор объекта, и он не будет иметь свойства gender, если оно не будет заполнено. Чтобы достичь своей цели только с помощью mongoose, вы можете написать запрос, подобный приведенному ниже. Сначала вам нужно найти все идентификаторы пользователей для вашего пола и идентификатора пользователя. Затем запросите в вашей схеме продукта возвращенные идентификаторы пользователей. Исправления и оптимизации приветствуются.

 router.get('/:gender', (req, res, next) => {
    userTbId.find({
      "gender": req.params.gender,
      "userId": req.params.userId
    }).exec()
    .then(docs => {
        let ids = docs.map(doc => doc.id);
        Product.find({
            "userTbId": {$in:ids}
        })
        .populate({
            path: 'userTbId'
        })
        .exec()
        .then(docs => {
            res.status(200).json({
                docs
            }); 
        })
        .catch(err => {
            res.status(500).json({
                error: err
            });
        });
    })
    .catch(err => {
        res.status(500).json({
            error: err
        });
    });
}); 

Комментарии:

1. Спасибо. Проблема решена. Из-за этого я страдал около 3 недель. Большое вам спасибо: D