mongodb通过数组字段中每个单词的首字母搜索字符串

编程入门 行业动态 更新时间:2024-10-06 06:41:01

mongodb通过<a href=https://www.elefans.com/category/jswz/34/1771288.html style=数组字段中每个单词的首字母搜索字符串"/>

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通过数组字段中每个单词的首字母搜索字符串

本文发布于:2024-05-13 08:40:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1759306.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数组   字段   字符串   单词   首字母

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!