【问题标题】:Doing partial search with mongoose用猫鼬做部分搜索
【发布时间】:2017-01-14 18:45:48
【问题描述】:

当我只给出 部分 查询时,我试图让 Mongoose 在查询中返回结果。例如:我有一个列出一堆公司的“公司”模式。一个文档示例:

{
"_id" : ObjectId("57aabeb80057405968de1539"),
"companyName" : "Vandelay Industries",
"owner" : "Ary Vandelay",
"inception" : 2012,
"__v" : 1
}

所以如果我做这样的搜索查询:

Company.findOne(
    { companyName: Vandelay Industries }, function (err, company) {
        if (company) {
            //do stuff
        }
    });

这将生成文档。但是如果我执行以下操作,我将不会得到结果:

Company.findOne(
    { companyName: Vandelay }, function (err, company) {
        if (company) {
            //do stuff
        }
    });

我希望能够进行此类部分搜索并仍然获得结果。 Mongoose 有没有办法做到这一点?

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    为了更快地获得结果,您应该使用索引 ref https://docs.mongodb.com/manual/text-search/

    db.Company.createIndex( { companyName: "text" } )
    

    然后你可以搜索

       db.Company.find( { $text: { $search: "company name" } } )
    

    但这仅支持全词搜索而不是部分搜索,因此添加额外的一行会有所帮助

       db.Company.find({ $or: [
                { $text: { $search: query } },
                 { companyName: { $regex: '^' + 'copmany name'} }
              ]}
    

    这将帮助您比平常更快地搜索结果

    【讨论】:

      【解决方案2】:

      您在进行全文搜索吗?如果你这样做:

      TagGroup.find({
          $text: {
              $search: text
          }
      }, {
          score: {
              $meta: "textScore"
          }
      }).sort({
          score: {
              $meta: 'textScore'
          }
      })
      

      试试下面的代码。您还需要在该架构上创建一个索引

      TagGroupSchema.index({
          "$**": "text"
      });
      

      Here is the document

      你也可以使用elasticsearch来做到这一点,当文档增长时,你应该考虑这种方式。

      【讨论】:

        【解决方案3】:

        您可以使用此query 获取特定值的结果

        Company.findOne({"companyName": /Vandelay/},function(err,company){
            if(!err){
                console.log(company);
            }
        });
        

        【讨论】:

          【解决方案4】:

          为了实现这一点,您可以使用正则表达式搜索来获得所需的结果。

          var searchKey = new RegExp('Vandelay', 'i')
          Company.findOne({ companyName: searchKey }, function (err, company) {
              if (company) {
                  //do stuff
              }
          });
          

          参考thisstackoverflow 帖子。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-11
            • 2014-11-17
            • 1970-01-01
            • 2020-02-17
            • 2018-08-29
            • 2020-05-30
            • 2016-08-05
            • 2021-10-05
            相关资源
            最近更新 更多