MongoRepository findOne 使用 "id" 而不是“_id”

MongoRepository findOne using "id" instead of "_id"

我的设置与这个非常相似:http://spring.io/guides/gs/accessing-data-mongodb/

在我的 POJO class 中,我使用了一个字符串字段(用@Id 注释)并手动设置它。

public class MyPojo {
  @Id
  private String id

  public MyPojo(String id) {
    this.id = id
  }

  //...
}

就像在示例中我使用了 MongoRepository 的扩展接口:

public interface MyPojoRepository extends MongoRepository<MyPojo, String> {

}

当我保存我的 object

myrepo.save(new MyPojo("user"));

一切正常,在我的 collection _id = "user" 中如我所料。

但是,如果我现在想查询object:

myrepo.findOne("user")

我收到空值。调试日志显示我的 collection 被查询

{ "id" : "user" }

而不是“_id”。这种行为是故意的吗?我觉得这很混乱。特别是因为 JavaDoc 在这里明确提到了术语 "id"。

//编辑:

myrepo.exists("user") 

returns 真...

不要使用构造函数

 public MyPojo(String id) {
   this.id = id
 }

因为您不能手动分配 id

MongoDB 在内部使用此字段,您将要将字符串放入 ObjectID 字段类型。

只需提供一个空的构造函数 and/or 构造函数来初始化作为文档一部分的字段(即 user.

的字符串类型的字段

在您的指南的 link 中,您有一个很好的例子!

更改保存在 MongoDB 中的字段名称的能力是通过使用以下注释: import org.springframework.data.mongodb.core.mapping.Field

通过使用注释,您可以在 mongoDB 中定义字段名称。

例如:

@Field("email")
private EmailAddress emailAddress;

现在 emailAddress 将使用密钥 email.

保存在数据库中

mongoDB 将始终使用 _id 作为文档的唯一标识符之一。

如果你有,你可以进行另一个字段调用 userId,这可以是 _id 字段的重复,但使用语法你喜欢,比如:

@Field("id")
private String userId;

希望对您有所帮助。