首页 > 解决方案 > 如何在 MongoDB 中组合 3 个查询的结果?

问题描述

我制作了以下过滤器,希望将所有 3 个$and数组的结果组合起来,但它只匹配其中一个块。

$and如果满足条件,如何组合从每个数组返回的结果。希望这很清楚。我不知道如何调用$and数组。

const filter = {
      $or: [
        {
          $and: [
            { category: req.query.category },
            { tags: req.query.subCategory },
            {contentType: req.query.contentType},
            req.query.searchTerm !== ""
              ? {
                  name: {
                    $regex: "(?i)" + req.query.searchTerm + "(?-i)",
                    $options: "i",
                  },
                }
              : {},
          ],
          $and: [
             { category: req.query.category },
            { tags: req.query.subCategory },
            {contentType: req.query.contentType},
            req.query.searchTerm !== ""
              ? {
                  description: {
                    $regex: "(?i)" + req.query.searchTerm + "(?-i)",
                    $options: "i",
                  },
                }
              : {},
          ],
          $and: [
             { category: req.query.category },
            { tags: req.query.subCategory },
            {contentType: req.query.contentType},
            req.query.searchTerm !== ""
              ? {
                  tags: {
                    $regex: "(?i)" + req.query.searchTerm + "(?-i)",
                    $options: "i",
                  },
                }
              : {},
          ],
        },
      ],
    };
 await Content.paginate(filter, options, (err, result) => {
      if (err) {
        res.status(500).send(err);
      } else {
        res.json(result);
      }
    });

编辑:下面是在数据库中找到的两个条目的示例。它应该工作的方式是它应该使用category,subCategorycontentType过滤掉数据库中的条目,以便我现在拥有的只是具有相同category,subCategorycontentType中指定的条目req.query,我将其称为firstFilterResult. 从那里,我尝试在其中搜索firstFilterResult以查看是否有具有nametagdescription匹配的条目。所以基本上catgeory,subCategorycontentType只是用来缩小结果的范围,以便我可以找到匹配的name,tagdescription. 我上面的代码并没有完全做到这一点,但这是它背后的想法,我认为我会做类似的事情,但我想我错了。

contents: [
      {
        tags: [
          'food',
          'drinks',
          'card',
          'account'
        ],
        _id: '1d13ff7m6db4d5417cd608f4',
        name: 'THE NAME FOR THIS PIECE OF CONTENT',
        description: 'In here I will begin to talk about...',
        content_id: '5dbcb998ad4144390c244093',
        contentType: 'quiz',
        date: '2019-06-03T04:00:00.000Z',
        category: 'food',
        image: 'https://IMAGE.PNG',
        __v: 0
      },
      {
        tags: [
          'computer',
          'laptop'
        ],
        _id: '7d1b940b1c9d44000025db8c',
        name: 'THE NAME FOR THIS PIECE OF CONTENT',
        description: 'This is another description',
        content_id: '5f1b963d1c9d44000055db8d',
        contentType: 'tool',
        date: '2019-06-03T04:00:00.000Z',
        category: 'money',
        image: 'https://IMAGE.PNG',
        __v: 0
      }
 ]

标签: reactjsmongodbmongoosemongodb-querymongojs

解决方案


我终于让它和这个一起工作了

 const catFilter =
      req.query.category !== "" ? { category: req.query.category } : {};
    const subCatFilter =
      req.query.subCategory !== "" ? { tags: req.query.subCategory } : {};
    const typeFilter =
      req.query.contentType !== ""
        ? { contentType: req.query.contentType }
        : {};
    const filter = {
      $and: [
        {
          $or: [
            {
              name: {
                $regex: req.query.searchTerm,
                $options: "i",
              },
            },
            {
              description: {
                $regex: req.query.searchTerm,
                $options: "i",
              },
            },
            {
              tags: {
                $regex: req.query.searchTerm,
                $options: "i",
              },
            },
          ],
        },
        catFilter,
        subCatFilter,
        typeFilter,
      ],
    };

推荐阅读