Вложенная схема запроса MongoDB

#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