数组字段中每个单词的首字母搜索字符串"/>
mongodb通过数组字段中每个单词的首字母搜索字符串
我在Mongo DB中有一个名为'Business Opportunities'的表(查看下图)。
当前,我正在创建节点js服务,它在其中返回表中business_opportunities字段的起始字母的所有匹配值。 (突出显示图片中的一个)
因此,如果我传递'A',它只应返回数据库中字母A的所有匹配项,但由于'business_opportunities'是一个数组字段,因此它返回所有具有匹配字段的值,例如在下面,
{"status":"success","code":200,"data":{"tags":[{"_id":"5aae9de344fdc45f6a5faf08","business_opportunities":["Web Design","app Design ","Coding","Software Engineer"]},{"_id":"5aae9de344fdc45f6a5faf14","business_opportunities":["audit","Accounting"]},{"_id":"5b86180c44fdc4427245ec71","business_opportunities":["Apps, website, development, programming, php, java, javascript, ruby, react, native","aws cloud services, ","ios, android, "]},{"_id":"5bb70d8c44fdc442dd41b702","business_opportunities":["accounting","quickbooks","xero","cloud accounting","financial","audit","consulting"]},{"_id":"5bbac54944fdc40d9f40f071","business_opportunities":["accommodation","rent","condo"]}]}}
这是我当前的代码,
static async findRelatedTags(opts, params) {
assert.object(params, 'params')
assert.string(params.tag, 'params.tag')
assert.number(params.limit, 'params.limit')
assert.object(opts, 'opts')
assert.object(opts.mongo_db, 'opts.mongo_db')
const { mongo_db: db } = opts
const query = [
{
$match: {
business_opportunities: { '$regex': '^'+params.tag+'' }
}
},
{
$project: {
business_opportunities: '$business_opportunities'
}
}
]
const cursor = db.collection('business_opportunities').aggregate([
...query
]).limit(params.limit)
return cursor.toArray()
}
所以我想要这样的输出,(如果我搜索'A')
{
"status":"success",
"code":200,
"data":{
"tags": {
accounting,
app design,
aws
}
}
}
有人可以帮我吗?
回答如下:您需要展开 business_opportunities,然后再将它们与正则表达式匹配。下面是更新的代码。
static async findRelatedTags(opts, params) {
assert.object(params, 'params')
assert.string(params.tag, 'params.tag')
assert.number(params.limit, 'params.limit')
assert.object(opts, 'opts')
assert.object(opts.mongo_db, 'opts.mongo_db')
const { mongo_db: db } = opts
const query = [
{ $unwind : "$comments" },
{
$match: {
business_opportunities: { '$regex': '^'+params.tag+'', $options: 'i' }
}
},
{ "$group": {
"_id": "$comments"
}
}
]
const cursor = db.collection('business_opportunities').aggregate([
...query
]).limit(params.limit)
var agg_results = cursor.toArray()
return agg_results.map(obj => obj._id)
}
MongoDB聚合将为您提供匹配的business_opportunities像这样
[{
"_id" : "accounting"
},
{
"_id" : "app design"
},
{
"_id" : "aws"
}]
[将其转换为[“会计”,“应用设计”,“ aws”]在上面的示例中,我添加了agg_results.map(obj => obj._id)
。
除了在您的代码中,正则表达式搜索为区分大小写,所以我使用{ '$regex': '^'+params.tag+'', $options: 'i' }
使其变为不区分大小写,如果不需要,请删除$ options。
更多推荐
mongodb通过数组字段中每个单词的首字母搜索字符串
发布评论