Java morphia - 按列表字段中的值查询

时间:2012-04-18 00:30:22

标签: java json mongodb morphia

不确定这是否可行,但这里有。

我有一个MongoDB(使用morphia来访问它),其中包含如下表格(此示例已简化,但概念相同):

{ Name : "Robert", NickNames : [ "Bob", "Twinkletoes" ] }
{ Name : "Trevor", NickNames : [ "Bob", "Mad man", "Tweedledee" ] }
{ Name : "Samuel", NickNames : [ "Sam" ] }
{ Name : "Patrick", NickNames : [ "Bob", "Mad man" ] }
{ Name : "Mark", NickNames : [ "Adam", "Bob", "Georg" ] }

为了这个例子的目的,让我们说昵称总是按字母顺序排列,昵称所在的位置是相关的。

因此,我们可以看到每个人的记录在列表中可以有不同数量的昵称。如何执行以下搜索:

  • 给我所有人的第一个绰号“Bob”和第二个绰号“Mad man”(即Person.Nicknames [0] =“Bob”&& Person.Nicknames [1] =“Mad人“)

    应该返回2条记录 - 特雷弗和帕特里克。

  • 给我所有人的第一个绰号“Bob”(即Person.Nicknames [0] =“Bob”)

    应该返回3条记录 - 罗伯特,特雷弗和帕特里克。

请注意,Mark没有被退回,因为他的绰号“Bob”不在第一个索引中。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

将元素插入数组后,将保留其顺序。

查询应该按照您的预期工作:(为简洁起见,省略了)

> db.people.find({"NickNames.0":"Bob", "NickNames.1":"Mad man"}, {_id:0})
{ "Name" : "Trevor", "NickNames" : [ "Bob", "Mad man", "Tweedledee" ] }
{ "Name" : "Patrick", "NickNames" : [ "Bob", "Mad man" ] }
> db.people.find({"NickNames.0":"Bob"}, {_id:0})
{ "Name" : "Robert", "NickNames" : [ "Bob", "Twinkletoes" ] }
{ "Name" : "Trevor", "NickNames" : [ "Bob", "Mad man", "Tweedledee" ] }
{ "Name" : "Patrick", "NickNames" : [ "Bob", "Mad man" ] }
> 

在“Dot Notation(Reaching into Objects)”文档的“Array by Position”部分中有一个简短的注释: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition

以上是在JS shell中完成的。我不熟悉Morphia,所以你必须自己将查询翻译成正确的Morphia语法。希望这有帮助!

答案 1 :(得分:0)

该职位是否相关?第一个查询是否也应该找到以下内容?

{ Name : "Mark", NickNames : [ "Adam", "Bob", "Georg" ] }

如果确切位置不相关,您可以使用hasThisElementhasAllOf(仅限相关部分):

.field("NickNames").hasThisElement("Bob")
.field("NickNames").hasAllOf(Arrays.asList(yourArrayOfStrings))