【发布时间】:2017-07-06 13:13:14
【问题描述】:
我有结构相当复杂的 MongoDB 文档:
顶级组织(一个元素)
许多属性,其中有趣的是创始人和经理
founders - 是一个创始人列表,每个创始人都有姓氏、名字、父名(和其他属性)
与 managers 相同 - 包含姓氏、名字、父名(和其他属性)的元素列表
我想在一个查询中按姓氏 + 名字 + 父名组合进行搜索。 查询应该支持多个姓氏、名字、父名(在 $in 的帮助下)(用于一个人的不同名字,即 jon、john、johny)
我当前的代码返回 ORGANISATION 中姓氏 + 名字 + 父名组合的组织,但我需要 PERSON 中的姓氏 + 名字 + 父名组合。可能吗?即使是正确的方向,而不是代码,也会感激不尽。据我了解, $elemMatch 不会帮助我,否则查询会很麻烦?也许确实存在更清洁的选择?
我已经尝试过改变
List<BasicDBObject> args
为
BasicDBObject name
并用追加填充它。没有任何改变。
我的代码:
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>());
实际上,最终的 argsListUL 中有更多的 DBObject,但为了简单起见,我删除了该代码。
更新 尝试使用 $elemMatch 在 shell 中构造最简单的查询。奇怪,但它不起作用:
db.collection.find( { "founders.typeperson.person": { $elemMatch: { "lastname": "bla" , "firstname": "bla","patronym" : "bla" } } } ).pretty()
得到 0 个结果。虽然 DB 中存在姓氏 + 名字 + 父名的组合。
另一个注意事项:数据库大小为 500GB,所以我认为投影中的 $elemMatch 会太慢。
【问题讨论】:
标签: mongodb mongodb-query