0

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

我有一个 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 man")

    应该返回 2 条记录 - Trevor 和 Patrick。

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

    应该返回 3 条记录 - Robert、Trevor 和 Patrick。

请注意,没有返回 Mark,因为他的昵称“Bob”不在第一个索引中。

有没有办法做到这一点?

4

2 回答 2

3

一旦元素被插入到数组中,它们的顺序将被保留。

查询应该像您期望的那样工作:(为简洁起见,省略了_id)

> 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 Element by Position”部分对此有一个简短的说明: http ://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into +Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition

以上是在 JS shell 中完成的。我不熟悉 Morphia,因此您必须自己将查询转换为正确的 Morphia 语法。希望这可以帮助!

于 2012-04-18T15:12:55.173 回答
0

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

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

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

.field("NickNames").hasThisElement("Bob")
.field("NickNames").hasAllOf(Arrays.asList(yourArrayOfStrings))
于 2012-04-18T01:10:45.550 回答