#javascript #node.js #mongodb #mongoose #nosql
Вопрос:
У меня есть следующие схемы:
Схема продукта:
_id: String
name: String
description: String
company: Company
Схема компании:
_id: String
name: string
Я пытаюсь найти все продукты, которые соответствуют моей строке запроса с именем или названием компании.
Я уже пытался:
const query: any[] = [
{
"company.name": {
$regex: name,
$options: "i",
},
},
{
"name": {
$regex: name,
$options: "i",
},
}
];
return Product.find()
.or(query)
.populate("company")
Данные — Продукты:
{ _id: "6067b7d7b5913759d9bb8b39", "name": "Test 1", "description": "Desc", "company": "6067b809c78a4a39ebeae4d4" }
Данные — Компании:
{ _id: "6067b809c78a4a39ebeae4d4", "name": "Facebook" },
{ _id: "59862209c78a4a39ebeae4d4", "name": "Apple" },
Ответ №1:
Этот запрос будет фильтровать только товары, не будет работать в вашем случае, так как вы также хотите фильтровать по company.name
Product.find()
.or(query)
.populate("company")
Демо — https://mongoplayground.net/p/VqREj1vvkss
Используйте запрос агрегации для достижения этой цели
db.companies.aggregate([
{ $lookup: { "from": "products", "localField": "_id", "foreignField": "company", "as": "products"} },
{ $unwind: "$products" },
{ $match: {
$or: [
{ "name": { $regex: "Test 1",$options: "i", }, },
{ "products.name": { $regex: "Test 1",$options: "i" } }
]}
}
])
https://mongoosejs.com/docs/api/aggregate.html#aggregate_Aggregate