#node.js #mongodb #express #mongoose #aggregate
Вопрос:
У меня есть три коллекции и схемы: Пользователь, Продукт и Заказ. А также три схемы :
const User = new Schema({
username: {
type: String,
required: true,
},
)};
const Product = new Schema({
name: {
type: String,
required: true,
},
)};
const Order = new Schema({
product: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Product',
required: true,
},
User: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true,
},
quantity: {
type: Number,
required: true,
},
)};
Чтобы получить вложенные объекты, я использую Product.find().populate('user product')
.
Однако в списке продуктов я использую Агрегацию для разбиения на страницы вместо использования поиска. Что эквивалентно заполнению в агрегации? потому что я проверил поиск, но он не работает.
let filter = {};
let data = [];
let total = [{ total: 0 }];
filter = { user: mongoose.Types.ObjectId(req.user.id) };
data = await Product.aggregate([
{
$match: filter,
},
{
$lookup: {
from: 'users',
localField: 'user',
foreignField: '_id',
as: 'user',
},
},
{ $unwind: '$user' },
{
$project: {
'user.password': 0,
},
},
{
$match: {
$or: [
{ 'user.username': { $regex: search, $options: 'x,g,i' } },
],
},
},
{
$limit: limit,
},
]);
if (data.length > 0) {
total = await Product.aggregate([
{
$match: filter,
},
{
$lookup: {
from: 'users',
localField: 'user',
foreignField: '_id',
as: 'user',
},
},
{ $unwind: '$user' },
{
$match: {
$or: [
{ 'user.username': { $regex: search, $options: 'x,g,i' } },
],
},
},
{
$count: 'total',
},
]);
}
Я видел другие вопросы, связанные с той же проблемой, но ни один из них, похоже, не работает для меня, я был бы очень признателен, если бы вы помогли мне решить эту проблему, спасибо!