MongoDB Embedded Objects에 ID(null 값)가 없습니다.
Spring Data가 있는 MongoDB에 대해 질문이 있습니다.다음 도메인 클래스가 있습니다.
@Document
public class Deal {
@Id
private ObjectId _id;
private Location location;
private User user;
private String description;
private String title;
private String price;
private boolean approved;
private Date expirationDate;
private Date publishedDate;
}
@Document
public class Location {
@Id
private ObjectId _id;
private Double latitude;
private Double longitude;
private String country;
private String street;
private String zip;
}
@Document
public class User {
@Id
private ObjectId _id;
private String email;
private String password;
private String profile_image_url;
private Collection<Deal> deals = new ArrayList<Deal>();
}
이 도메인을 사용하면 CRUD를 성공적으로 수행할 수 있습니다.단 한 가지 문제가 있습니다.거래가 있는 사용자를 저장할 때 MongoDB에 저장할 때 거래 및 위치는 _id가 null로 설정됩니다.MongoDB가 포함된 개체에 대한 고유 ID를 생성할 수 없는 이유는 무엇입니까?
단일 거래로 사용자를 저장한 후의 결과:
{ "_id" : ObjectId( "4fed0591d17011868cf9c982" ),
"_class" : "User",
"email" : "milo@gmail.com",
"password" : "mimi",
"deals" : [
{ "_id" : null,
"location" : { "_id" : null,
"latitude" : 2.22,
"longitude" : 3.23445,
"country" : "Denmark",
"street" : "Denmark road 77",
"zip" : "2933" },
"description" : "The new Nexus 7 Tablet. A 7 inch tablet from Google.",
"title" : "Nexus 7",
"price" : "1300",
"approved" : false,
"expirationDate" : Date( 1343512800000 ),
"publishedDate" : Date( 1340933521374 ) } ] }
결과에서 알 수 있듯이 거래 및 위치 ID는 NULL로 설정됩니다.
MongoDB CRUD 작업(insert
,update
,find
,remove
모두 최상위 문서에서만 작동합니다. 물론 내장된 문서의 필드별로 필터링할 수도 있습니다.내장된 문서는 항상 상위 문서 내에서 반환됩니다.
그_id
필드는 상위 문서의 필수 필드이며, 일반적으로 필요하지 않거나 내장된 문서에 있습니다.고유한 식별자가 필요한 경우에는 반드시 해당 식별자를 생성할 수 있으며, 다음을 사용할 수 있습니다._id
코드 또는 정신 모델에 적합한 경우 저장할 필드. 보다 일반적으로 "사용자 이름", "기타 시스템 키" 등을 나타내는 이름을 사용합니다.MongoDB 자체도 드라이버도 자동으로 채워지지 않습니다._id
최상위 문서를 제외한 필드입니다.
특히 Java에서 객체 ID 값을 생성하려는 경우_id
내장된 문서의 필드에서 다음 작업을 수행할 수 있습니다.
someEmbeddedDoc._id = new ObjectId();
REST 아키텍처의 맥락에서 중첩된 문서가 자체 ID를 가지고 있다는 것은 모두 의미가 있습니다.
- 지속성 구현은 리소스 표현과 독립적이어야 합니다.API 소비자로서 저는 당신이 mongo를 사용하든 mysql을 사용하든 상관하지 않습니다.ID가 없는 문서를 mongo에 중첩하는 경우 지속성 계층을 관계형 데이터베이스로 변경하는 방법을 상상해 보십시오.이제 구현 독립적인 접근 방식을 사용하여 사전에 생각해 본 후 동일한 연습을 수행합니다.관계형 DB, 루트 및 중첩된 문서의 중첩된 문서 모델링은 각각 고유한 ID를 가진 서로 다른 엔티티/테이블이 됩니다.루트는 중첩된 문서와 일대일 관계를 가질 수 있습니다.
- 순차적으로 접근하는 대신 중첩된 문서에 직접 접근해야 할 수 있습니다.mongo에서 발행한 것처럼 절대적으로 고유한 ID는 필요하지 않을 수도 있지만, 여전히 로컬 고유 식별자가 필요합니다.이것은 루트 문서 내에서 고유합니다.
중첩된 문서 @dcrosta에서 ID의 필요성에 대한 내 요점을 주장한 후 _id 필드를 mongo에 채우는 방법에 대해 이미 정답을 제시했습니다.
이게 도움이 되길 바랍니다.
_id는 루트 문서에서만 기본적으로 하위 문서에 설정되지 않습니다.
삽입 및 업데이트 시 하위 문서에 대한 _id를 정의해야 합니다.
는 Mongo를 만들거나 필요로 하지 ._id
내장된 문서의 아들.추가할 수 있습니다._id
당신이 원한다면 필드 - 나는 그것을 했습니다.
@Document
public class Location {
@Id
private ObjectId _id;
public Location() {
this._id = ObjectId.get();
}
}
@Document
public class User {
@Id
private ObjectId _id;
public User() {
this._id = ObjectId.get();
}
}
이것은 저에게 아주 좋습니다.
다른 답변은 이제 더 이상 적용되지 않습니다.모든 하위 문서는 다음을 얻습니다._id
자로으동. 사실피를 는 적하위기해._id
.
{ _id: false }
하위 문서 스키마에 있습니다.
언급URL : https://stackoverflow.com/questions/11255100/mongodb-embedded-objects-have-no-id-null-value
'programing' 카테고리의 다른 글
MongoDB 시간 없이 날짜만 비교 (0) | 2023.07.04 |
---|---|
pymongo를 사용하여 mongodb에서 쿼리 날짜를 만드는 방법은 무엇입니까? (0) | 2023.07.04 |
Pyodbc Connection 개체를 팬더와 함께 사용할 때 경고 표시 (0) | 2023.07.04 |
다양한 경우에 테이블 열을 기준으로 정렬하려면 어떻게 해야 합니까(Oracle) (0) | 2023.07.04 |
c# 메모리 스트림 대 바이트 어레이 (0) | 2023.07.04 |