#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