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

时间:2015-02-15 22:37:51

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

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

在我的POJO类中,我使用String字段(用@Id注释)并手动设置。

public class MyPojo {
  @Id
  private String id

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

  //...
}

在示例中,我使用MongoRepository的扩展接口:

public interface MyPojoRepository extends MongoRepository<MyPojo, String> {

}

保存对象时

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

一切正常,在我的收藏中_id =&#34; user&#34;正如我所期待的那样。

但是,如果我想现在查询该对象:

myrepo.findOne("user")

我收到null。调试日志显示我的集合是用

查询的
  

{&#34; id&#34; :&#34;用户&#34; }

而不是&#34; _id&#34;。这种行为是有意的吗?我觉得这很混乱。特别是因为JavaDoc明确提到术语&#34; id&#34;这里。

//编辑:

myrepo.exists("user") 

返回true ...

2 个答案:

答案 0 :(得分:3)

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

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

例如:

this.$router.push('/path')

现在 emailAddress 将使用电子邮件键保存在数据库中。

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

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

@Field("email")
private EmailAddress emailAddress;

我希望有所帮助。

答案 1 :(得分:0)

不要使用构造函数

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

因为您不得手动分配 id

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

只需提供一个空构造函数和/或构造函数,用于初始化属于文档的字段(即 user 的String类型字段。

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