【问题标题】:How to build an $in query of ObjectIds using QueryBuilder with MongoDB如何使用 QueryBuilder 和 MongoDB 构建 ObjectIds 的 $in 查询
【发布时间】:2012-10-09 11:40:17
【问题描述】:

我正在尝试使用 QueryBuilder (MongoDB Java API 2.9.1) 构建 $in 查询。当查询是字符串数组时我没有问题,但是当我尝试使用 ObjectIds 数组时它不起作用(不返回任何内容)。

我能够成功运行查询并从控制台获得结果:

在控制台中查询: db.collection.find({removed:false,app_id: {$in : [ObjectId("4f75c533ac99d845186e19b2"), ObjectId("4f75c533ac99d845186e19b3")]}})

QueryBuilder (MongoDB Java API 2.9.1) 创建的查询:

对象[] id;

Java 代码: DBObject query = QueryBuilder.start("app_id").in(ids).and("removed").is(false).get();

DBObject 上的 ToString 产生: { "app_id" : { "$in" : [ { "$oid" : "4f75c533ac99d845186e19b2"}]} , "removed" : false}

不确定是我做错了什么还是 API 不支持 $in 类型的 ObjectId 查询。有任何想法吗?

【问题讨论】:

  • 可能只是一个错字,但您在 shell 中使用“application_id”,ToString 输出显示“app_id”。
  • 抱歉 toString 输出是正确的。它应该读取 app_id 而不是 application_id。我会更新问题。
  • 在您的控制台查询中,您的数组中有两个 objectid,但是当您在 Java 代码中运行它时,您只有一个 object id,所以也许这就是为什么没有匹配查询的原因。这是一个错字吗?尝试打印出您的 ids 数组,您是否将正确的东西传递给您的 .in() ?这是笔误吗?
  • 两个 objectIds 都将匹配,因此结果大小会不同,但查询返回的结果却不是。
  • 两个 objectId 都将匹配,因此结果大小会不同,但查询应该返回一个它不返回的结果。我遗漏的是,如果您运行查询,但不是使用 ObjectIds app_id 是字符串类型,那么查询就可以工作。

标签: mongodb query-builder


【解决方案1】:

您的 ID 应该是 org.bson.types.ObjectId 类型,所以这样的东西应该可以工作:

import org.bson.types.ObjectId;

ObjectId[] ids = new ObjectId[]{
  new ObjectId("1234568abcd"), 
  new ObjectId("1234567abcd")};

DBObject query = QueryBuilder.start("app_id").in(ids)
  .and("removed").is(false).get();

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2013-07-20
    • 1970-01-01
    • 2013-10-10
    • 2013-07-07
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多