mongodb - MongoDB 聚合 - 通过包含文本对结果进行分组
问题描述
我有以下类型的对象:
"name":string,
"title": string,
"body": string
我需要执行聚合查询,以查找在某个字段中包含特定文本的对象。结果应按以下规则分组:
- 第一个名称包含文本的对象。
- 然后对象的标题包含文本。
- 然后是其主体包含文本的对象。
聚合的第一阶段如下所示:
"$match" : {
"$or" : [
{
"name" : /.*hellow world.*/i
},
{
"title" : /.*hellow world.*/i
},
{
"body" : /.*hellow world.*/i
}
]
}
- 另外,我正在使用分页。
- 从 node.js 服务器请求的查询。
我的第一个问题是我仍然没有弄清楚是否可以在聚合管道中执行这样的分组。
另外,我试图首先执行三个查询,以获取他们的名字包含术语的结果,然后是他们的标题和正文的结果。使用这种方法我几乎没有其他问题:对服务器的三个查询效率不高,而且管理分页也增加了整个过程的复杂性。
解决方案
您可以使用$facet单独应用您的条件,然后运行$concatArrays来合并结果:
db.col.aggregate([
{
$facet: {
name: [ { $match: { "name" : /.*hello world.*/i } } ],
title: [ { $match: { "title" : /.*hello world.*/i } } ],
body: [ { $match: { "body" : /.*hello world.*/i } } ],
}
},
{
$project: {
data: {
$concatArrays: [ "$name", "$title", "$body" ]
}
}
}
])
推荐阅读
- javascript - 以角度反应形式绑定表单数组值
- javascript - 我的 Node 和 express 应用程序在错误处理中间件时没有收到 req.session?
- javascript - 如何在 React 中实现文本转语音
- phpunit - Laravel 测试 - 该名称已被使用
- python-3.x - 解析数据框列中的 json
- javascript - React Native Chart Kit - 条形图颜色从上到下淡出每个条形图
- python - 如何在 Python 中使用 Matplotlib 绘制时间线图?
- python - Python github 使用用户名和密码拉取
- android - Google Play 控制台读取的 .Keystore 值与 Keytool 不同
- vue.js - NuxtJS - 我想知道如何为特定页面实现加载