如何在 MongoDB 中合并 3 个查询的结果?
How can I combine the results of 3 queries in MongoDB?
我制作了以下过滤器,希望能合并所有 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
、subCategory
和 contentType
来过滤掉数据库中的条目,这样我现在所拥有的只是具有相同 category
、subCategory
和 req.query
中指定的 contentType
,我将其称为 firstFilterResult
。从那里,我试图在 firstFilterResult
内搜索以查看我是否有具有 name
、tag
或 description
匹配项的条目。所以基本上 catgeory
、subCategory
和 contentType
只是用来缩小结果范围,以便我可以找到 name
、tag
和 [=27] 的匹配项=].我上面的代码并没有完全做到这一点,但这是它背后的想法,我认为我会做类似的事情,但我想我错了。
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
}
]
由于 $or
的每个元素都包含相同的 3 个检查和一个不同的检查,因此可以将它们分开,然后只有在指定搜索词时才需要 $or
.
传递 options:"i"
使整个正则表达式匹配不区分大小写,因此没有必要用 (?i)
和 (?-i)
将搜索字符串括起来
以下应该构建您正在尝试的过滤器,而不使用空对象:
// base query that checks the common fields
var filter = {
category: req.query.category,
tags: req.query.subCategory,
contentType: req.query.contentType
};
// if a search term is provided, add in the additional critera
if (req.query.searchTerm !== "") {
var regex = {
$regex: req.query.searchTerm,
options:"i"
};
filter['$or'] = [
{ name: regex },
{ description: regex },
{ tags: regex }
]
}
如果这没有获得您想要的结果,请编辑问题并添加一些示例文档,以便我们可以看到问题。
我终于可以使用它了
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,
],
};
我制作了以下过滤器,希望能合并所有 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
、subCategory
和 contentType
来过滤掉数据库中的条目,这样我现在所拥有的只是具有相同 category
、subCategory
和 req.query
中指定的 contentType
,我将其称为 firstFilterResult
。从那里,我试图在 firstFilterResult
内搜索以查看我是否有具有 name
、tag
或 description
匹配项的条目。所以基本上 catgeory
、subCategory
和 contentType
只是用来缩小结果范围,以便我可以找到 name
、tag
和 [=27] 的匹配项=].我上面的代码并没有完全做到这一点,但这是它背后的想法,我认为我会做类似的事情,但我想我错了。
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
}
]
由于 $or
的每个元素都包含相同的 3 个检查和一个不同的检查,因此可以将它们分开,然后只有在指定搜索词时才需要 $or
.
传递 options:"i"
使整个正则表达式匹配不区分大小写,因此没有必要用 (?i)
和 (?-i)
以下应该构建您正在尝试的过滤器,而不使用空对象:
// base query that checks the common fields
var filter = {
category: req.query.category,
tags: req.query.subCategory,
contentType: req.query.contentType
};
// if a search term is provided, add in the additional critera
if (req.query.searchTerm !== "") {
var regex = {
$regex: req.query.searchTerm,
options:"i"
};
filter['$or'] = [
{ name: regex },
{ description: regex },
{ tags: regex }
]
}
如果这没有获得您想要的结果,请编辑问题并添加一些示例文档,以便我们可以看到问题。
我终于可以使用它了
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,
],
};