【问题标题】:MongoTemplate criteria query translation seems incorrectMongoTemplate 标准查询翻译似乎不正确
【发布时间】:2012-12-28 12:24:13
【问题描述】:

我正在查询一个包含嵌套对象的集合。域模型如下所示:

@Document(collection="a")
public class A {

   protected Map<String, B> fields;
   protected String uuid;
   protected Date updatedTs;

   //Getters and setters and other fields omitted
}

public class B{

   protected String c;
   protected String d;

}

我正在使用如下所示的条件进行查询:

{ "uuid" : "9DA291A4-1BAB-4B9C-844D-681C3F1ABF6E"}

我使用

创建的
Criteria.where("uuid").is(uuid);

我可以看到条件对象不包含其他内容,因为我可以这样打印出来:

log.debug("Criteria: " + SerializationUtils.serializeToJsonSafely(c.getCriteriaObject()));

如果我打开包 org.springframework.data.mongodb.core 的调试日志记录,我可以看到实际发送到服务器的查询是:

{ "uuid" : "9DA291A4-1BAB-4B9C-844D-681C3F1ABF6E"} fields: null

编辑:我的文档包含一个名为“字段”的字段,似乎我的代码或 mongoTemplate / spring-data 中的某些内容实际上正在搜索字段:null。 MongoTemplate 的日志行让我感到困惑,因为 fields: null 实际上是指要返回的一组字段名称。

那么,如何在没有 spring-data 的情况下搜索与该 uuid 匹配的文档,只返回属性“fields”为空的文档?

同时,仍在研究如何解决这个问题,因为我无法更改文档结构...

【问题讨论】:

  • 您的查询将仅返回 A 类中的文档,因为只有 A 类具有 UUID 字段。 Fields:null 意味着其他的东西。我一直在调试模式下看到这一点。很可能您只查询了特定的 UUID,而字段恰好为空。
  • 可能是我的映射错误,但我不确定。我的文档的结构是这样的:{uuid: "abc123", fields: {"a":b","c":{"d":true}}}。这就是我所说的嵌套文档。我没有知道除了我所做的以外的任何其他方式来明智地映射这个。我知道查询只会返回集合'A'中的文档
  • 为什么不尝试查询 {fields.a:"b"} 看看它是否有效?
  • 嗯。如果我没有条件查询,我会得到集合中的所有文档以及所有嵌套文档。如果我查询给定的 uuid 和某个字段值,我会得到所有具有该字段值的文档,而不管 uuid 是什么。这就好像它忽略了这部分标准。
  • 实际上,废弃最后一个 - 我得到所有没有条件的文档,正如预期的那样,但是如果我添加一个包含已知嵌套对象的节点的查询(在 mongo 中运行时返回超过 400 个文档shell),然后我没有得到任何结果

标签: java mongodb spring-data spring-data-mongodb


【解决方案1】:

您在日志输出中看到的fields 与您的域对象无关。这可以通过将其放置在 JSON 字符串之外来表示。在这种情况下,fields 是指应为找到的每个文档返回的字段,基本上是 projection mechanism.

【讨论】:

  • 是的,谢谢,我想到了——它只是暂时把我扔了,因为它与我的文档属性之一同名。当我查看 MongoTemplate 的源代码时,我看到了它记录的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多