Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 속성 ID가 레코드 ID와 동일한 모든 문서를 조회하는 방법

MongoDB에서 속성 ID와 레코드 ID가 일치하는 문서 찾기

MongoDB에서 문서 내부의 속성 값이 해당 문서의 _id 필드와 동일한 경우를 찾아야 할 때가 있습니다. 이런 조건 비교는 일반적인 쿼리 연산자로는 처리하기 어렵기 때문에, $where 연산자를 사용하고 JavaScript의 == 연산자로 값을 비교하는 방식으로 해결할 수 있습니다.

1. 테스트용 컬렉션 생성

먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.demo69.insertOne(
... {
...    "_id" : ObjectId("507c7f79bcf86cd7994f6c0e"),
...    "Details" : {
...       "id" : ObjectId("507c7f79bcf86cd7994f6c0e")
...    }
... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("507c7f79bcf86cd7994f6c0e")
}
> db.demo69.insertOne(
... {
...    "_id" : ObjectId("507c7f79bcf86cd7994f6c0f"),
...    "Details" : {
...       "id" : ObjectId("507c7f79bcf86cd7994f6c0a")
...    }
... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("507c7f79bcf86cd7994f6c0f")
}

위 예제에서 첫 번째 문서는 _idDetails.id가 동일한 ObjectId를 가지고 있고, 두 번째 문서는 서로 다른 값을 가지고 있습니다.

2. find() 메서드로 전체 문서 확인

find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.

> db.demo69.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("507c7f79bcf86cd7994f6c0e"), "Details" : { "id" : ObjectId("507c7f79bcf86cd7994f6c0e") } }
{ "_id" : ObjectId("507c7f79bcf86cd7994f6c0f"), "Details" : { "id" : ObjectId("507c7f79bcf86cd7994f6c0a") } }

3. $where를 사용한 조건 조회 쿼리

이제 속성 ID(Details.id)가 레코드 ID(_id)와 일치하는 모든 문서를 찾는 쿼리를 작성해 보겠습니다. 두 ObjectId는 문자열로 변환한 후 비교해야 정확하게 일치 여부를 판단할 수 있습니다.

> db.demo69.find({
...    $where: function(){
...       return this._id.toString() == this.Details.id.toString();
...    }
... }).pretty();

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("507c7f79bcf86cd7994f6c0e"),
   "Details" : {
      "id" : ObjectId("507c7f79bcf86cd7994f6c0e")
   }
}

참고 사항

$where 연산자는 각 문서마다 JavaScript 함수를 실행하기 때문에 성능이 좋지 않으며, 대량의 데이터를 다룰 때는 인덱스를 활용하지 못한다는 점에 유의해야 합니다. 따라서 데이터 양이 많은 운영 환경에서는 집계 파이프라인의 $expr이나 애플리케이션 단에서의 사전 계산된 필드 사용을 고려하는 것이 좋습니다. 소규모 데이터나 관리 작업 용도라면 위 방법이 간단하고 효과적인 해결책입니다.