【问题标题】:MongoDB Morphia elemMatch APIMongoDB Morphia elemMatch API
【发布时间】:2015-06-22 11:20:08
【问题描述】:

我正在尝试将其放入 morphia 查询中:

db.woot.find({
    "bar.tables": {
        $elemMatch: {
            "tableId": {
                $in: [3,
                4]
            },
            "tab": {
                $gte: 20000
            }
        }
    }
})

所以我有:

Query<Table> q
q.field("bar.table").hasThisElement()

在此之后,我不知道如何完成查询,并且仍然使用支持 in()、gte() 方法的 FieldEnd,而无需自己使用 BasicDBObjects 编写整个查询。

请帮我将上面的查询转换为最好的 Morphia 等价物。

编辑:bar.tables 是一个数组,因此必须使用 elemMatch 进行匹配,否则它可以匹配某个元素的第一个条件和另一个元素的第二个条件,但只有同时匹配这两个条件的元素才有效。

【问题讨论】:

  • 为了得到正确的结果:(bar.table.tableId 必须是 3 或 4)和 bar.table.tab 必须大于 20,00 — 正确吗?
  • 是的。但请注意,它也可以是任何其他运算符或数据。查询建立在指定操作符和数据的 API 之上。

标签: mongodb morphia


【解决方案1】:

Morhpia 现在具有 elemMatch,因此您可以执行原始查询。

Query<Example> tableQuery = mongoDatastore.createQuery(Example.class)
             .disableValidation()
             .field("tableId").hasAnyOf(Arrays.asList(3, 4))
             .field("tab").greaterThanOrEq(20000);
Query<Table> query = getCDB().getDatastore()
            .createQuery(Table.class)
            .field("bar.table").elemMatch(tableQuery);

按照这些思路应该可以工作。

【讨论】:

    【解决方案2】:

    我会尝试这样的事情:

    Query<Table> query = mongoDataStore.find(Table.class)
      .field("bar.table.tableId").hasAnyOf(tableIdArrayList)
      .field("bar.table.tab").greaterThan(20000);
    

    您可能需要一些自定义查询构建器,您可以在其中设置一些条件,然后它将为您组合正确的查询 - 至少这是我们的方法。

    【讨论】:

    • 我想我忘了提到非常重要的事情。 bar.table 实际上应该是 bar.tables 因为它是一个数组。所以你需要匹配元素,否则一个元素可以满足第一个条件,而另一个元素可以满足第二个条件。但是一个元素应该同时满足这两个条件才能成为有效的结果。
    • 我认为 Morphia 不可能做到这一点——您可能需要退回到 Java 驱动程序并在那里创建一个子文档,请参阅stackoverflow.com/a/29818539/573153
    • 是的,这就是备份计划。虽然希望通过 Morphia 来实现它。
    猜你喜欢
    • 2013-11-24
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多