【问题标题】:Java morphia - query by values in a list fieldJava morphia - 按列表字段中的值查询
【发布时间】:2012-04-18 00:30:21
【问题描述】:

不确定这是否可能,但可以。

我有一个 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”不在第一个索引中。

有什么办法吗?

【问题讨论】:

    标签: java json mongodb morphia


    【解决方案1】:

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

    查询应该按照您的预期工作:(为简洁起见,省略了_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 语法。希望这会有所帮助!

    【讨论】:

    • 足够接近让我得到答案,谢谢!转换为 morphia 时的实际查询如下所示: query.field("NickNames.0").equal("Bob"); 注意,您必须禁用验证在查询上让它工作 (query.disableValidation())
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 不幸的是,在我的情况下,这个位置是相关的。让我更新我的问题以反映这一点
    • 那我不知道。我什至不确定 Morphia / MongoDB 会保证保留您的订单(他们通常会这样做,但不确定是否总是如此)。如果保证顺序,您可以使用limit(2) 获取前两个条目(如果您不想从第一个条目开始,请使用offset())并使用Java 的contains 检查列表。不漂亮,但可能是一种解决方法......
    • 可惜了。那么我可能不得不重新审视数据结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 2012-02-05
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多