当前位置: 首页 > 知识库问答 >
问题:

MongoDB中的搜索范围,需要子元素,而不是整个文档

王景山
2023-03-14

我有结构相当复杂的MongoDB文档:

高层组织(一个要素)

我想通过lastname+firstname+patronym组合在一个查询中进行搜索。查询应该支持多个lastnames、firstnames、patronyms(在$in的帮助下)(用于一个人的不同名字,即jon、john、johny)

我当前的代码返回组织内部有lastname+firstname+patronym组合,但我需要在personal内部有lastname+firstname+patronym组合。有可能吗?即使是正确的方向,而不是代码,也会很感激。据我所知,$elemmatch对我没有帮助,或者它将是一个非常繁琐的查询?也许真的有更干净的选择?

我已经试着改变了

List<BasicDBObject> args 

对于

BasicDBObject name

并使用append填充它。什么都没变。

我的代码:

List<BasicDBObject> args = new ArrayList<>();
args.add(new BasicDBObject("founders.typeperson.person.lastname", new BasicDBObject("$in", request.getLastnames())));
args.add(new BasicDBObject("founders.typeperson.person.firstname", new BasicDBObject("$in", request.getFirstnames())));
args.add(new BasicDBObject("founders.typeperson.person.patronym", new BasicDBObject("$in", request.getPatronyms())));
argsListUL.add(new BasicDBObject("$and", args));

result = collection.find(new BasicDBObject("$or", argsListUL)).into(new ArrayList<Document>());

实际上,在final arglistul中有更多的dbobject,但为了简单起见,我删除了该代码。

更新尝试使用$elemmatch在shell中构建最简单查询。奇怪,但不起作用:

db.collection.find( { "founders.typeperson.person": { $elemMatch: { "lastname": "bla" , "firstname": "bla","patronym" : "bla"  } } } ).pretty()

另一个注意事项:数据库的大小是500GB,所以我认为投影中的$elemmatch会太慢。

共有1个答案

简培
2023-03-14

也许您应该尝试共享您的数据库方案。您的数据库方案与您的任务不明确。

但据我所知,您的数据结构如下所示。虽然如果结构或需求有任何不同,我将更新答案。

{
  "_id": ObjectId(''),
  "organization": "x",
  founders: [
    {
      lastname: 'a'
      firstname: 'a',
      patronym: 'a'
    },
    {
      lastname: 'b'
      firstname: 'b',
      patronym: 'b'
    }
  ],
  managers: [
    {
      {
        lastname: 'c'
        firstname: 'c',
        patronym: 'c'
      },
      {
        lastname: 'd'
        firstname: 'd',
        patronym: 'd'
      }
    }
  ]

}

我可以建议您研究一下聚合管道。

db.collection.aggregate([{
  $match: {
    'organization': '<name>'
  }
}, {
  $unwind: '$managers'
}, {
  $unwind: '$founders'
}, {
  $match: {

    $or: [{
      $or: [{
        "managers.lastname": {
          $regex: 'searchString',
          $options: 'i'
        }
      }, {
        "managers.firstname": {
          $regex: 'searchString',
          $options: 'i'
        }
      }, {
        "managers.patronym": {
          $regex: 'searchString',
          $options: 'i'
        }
      }]
    }, {
      $or: [{
        "founders.lastname": {
          $regex: 'searchString',
          $options: 'i'
        }
      }, {
        "founders.firstname": {
          $regex: 'searchString',
          $options: 'i'
        }
      }, {
        "founders.patronym": {
          $regex: 'searchString',
          $options: 'i'
        }
      }]
    }]
  }
}, {
  $group: {
    "_id": {
      "_id": "$_id",
      "organization": "$organization",
    },
    "founders": {
      "$push": '$founders'
    }, 
    "managers": {
      "$push": '$managers'
    }
  }
}, {
  $project: {
    "_id": 0,
    "founders": 1,
    "managers" 1
  }
}])

如果要存储在founders&managers子文档中的数据不大,则$regex查询不会导致任何性能瓶颈。

 类似资料:
  • 如何仅在工作区的一个子文件夹中搜索? CTRL SHIFT F在整个工作区中搜索,并且由于它很大,我在不相关的文件夹和文件中获得了太多的命中。

  • 在我的一个项目中,我们支持使用XML进行数据输入。由于XML是一个用户输入文件,它很有可能是一个有效的XML,但有一些语义错误(例如字符串长度大于允许的限制等)。 目前我正在使用javax。xml。验证。Validator验证给定文档,但即使一个元素有语义错误,也会失败。我想要的是能够跳过这些元素,而不是跳过整个XML。我知道我们可以为验证器设置一个错误处理程序,我可以在其中跳过此类错误,但这意味

  • 本文向大家介绍solr范围搜索,包括了solr范围搜索的使用技巧和注意事项,需要的朋友参考一下 示例 age:[50 TO 60] 匹配年龄在50和60之间(包括50和60)的文档 age:{50 TO 60} 匹配年龄在50到60之间(不包括50到60)的文档 age:[* TO 60] 匹配年龄小于或等于60的文档 age:[50 TO *] 匹配年龄大于或等于50的文档 age:{50 to

  • 我跟随Simon Holmes的《变得卑鄙》一书,但是,我偶然发现了一个关于子文档ID的问题。我试图使用mongoose文档提供的“MongooseDocumentArray.id(id)helper函数在“Location document”中请求“review document”。但是,我的所有子文档都生成“id”,但前面提到的函数需要“_id”,因此返回“null”对象。 函数说明:搜索数组

  • 问题内容: 如果我只想在循环中使用索引,则最好将函数与 还是?即使我根本不使用? 问题答案: 我会使用它,因为它更通用- 例如它将在可迭代对象和序列上工作,并且仅返回对对象的引用的开销并不算大-尽管(对我而言)按您的意图更易于阅读- 在不支持…的物体上折断

  • 当执行整个Rails应用程序的搜索时,我使用自定义范围来排除我不关心的区域的结果。比如日志文件、供应商插件等。这一直运行良好,除了自从添加了RVM支持以来,我的搜索现在包括安装的每个gem中的所有文件。当我的项目代码中实际上只有几个命中时,这通常会产生大量的搜索结果。 我很难想出一个规则来排除我的 .rvm 目录中的 gem。 我已经尝试了大量的排除规则的变体,如下所示: 我怀疑问题可能与项目外部