不确定这是否可行,但这里有。
我有一个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”不在第一个索引中。
有没有办法做到这一点?
答案 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" ] }
如果确切位置不相关,您可以使用hasThisElement
和hasAllOf
(仅限相关部分):
.field("NickNames").hasThisElement("Bob")
.field("NickNames").hasAllOf(Arrays.asList(yourArrayOfStrings))