MongoDB 컬렉션 내에 포함된 특정 문서를 가져오는 방법은 무엇입니까?
저는 Notes라는 배열 문서가 내장된 모음 노트북을 가지고 있습니다.샘플
문서는 아래와 같이 보입니다.
{
"_id" : ObjectId("4f7ee46e08403d063ab0b4f9"),
"name" : "MongoDB",
"notes" : [
{
"title" : "Hello MongoDB",
"content" : "Hello MongoDB"
},
{
"title" : "ReplicaSet MongoDB",
"content" : "ReplicaSet MongoDB"
}
]
}
"Hello MongoDB"라는 제목의 노트만 알고 싶습니다.나는 무엇을 해야 할지 모르겠어요
의문의 여지가 있습니다누가 나를 도와줄 수 있습니까?
mongo version 2.2 이상에서 이 작업을 수행할 수 있습니다.
다음과 같은 쿼리:
db.coll.find({ 'notes.title': 'Hello MongoDB' }, {'notes.$': 1});
로 시도할 수 있습니다.$elemMatch
젠킨스처럼
오래된 답변:다른 답변을 참조하십시오.
저는 당신이 요구하는 것이 가능하다고 생각하지 않습니다, 적어도 약간의 지도 축소 없이 가능할까요?
MongoDB에서 포함된 문서 필터링을 참조하십시오.
이 대답은 데이터를 사용하는 방법에 더 적합하도록 스키마를 변경할 것을 제안합니다.
"도트 표기법" 또는 $elemMatch를 사용하여 일치하는 "노트 제목"이 있는 올바른 문서를 반환할 수 있습니다.
> db.collection.find({ "notes.title" : "Hello MongoDB"}, { "notes.title" : 1"});
아니면...
> db.collection.find({ "notes" : { "$elemMatch" : { "title" : "Hello MongoDB"} }});
그러나 일치를 유발한 배열 요소뿐만 아니라 전체 배열을 되찾을 수 있습니다.
또한 현재 설정으로는 배열의 항목에 대한 작업을 수행하기가 어렵습니다.
스키마를 변경하지 않으면(에 연결된 답변에서 알 수 있듯이) ...필요한 경우 쉽게 삭제할 수 있도록 배열의 각 요소에 "ids"를 추가하는 것을 고려해 보겠습니다.
MongoDb 버전 3.2+에서 집계를 사용하여 이 작업을 수행할 수 있습니다.
쿼리:
db.Notebook.aggregate(
{
$project: {
"notes": {
$filter: {
input: "$notes",
as: "note",
cond: {
$eq: [ "$$note.title", "Hello MongoDB" ]
}
}
}
}
}
)
결과:
{
"_id" : ObjectId("4f7ee46e08403d063ab0b4f9"),
"notes" : [
{
"title" : "Hello MongoDB",
"content" : "Hello MongoDB"
}
]
}
변수에 액세스하는 데 사용됩니다.새로 생성된 파일에 액세스하기 위해 사용했습니다.note
안의 $filter
.
$filter, $eq 및 $에 대한 자세한 내용은 공식 문서에서 확인할 수 있습니다.
$filter:지정된 조건을 기준으로 반환할 배열의 하위 집합을 선택합니다.조건과 일치하는 요소만 포함된 배열을 반환합니다.반환된 요소는 원래 순서대로 나열됩니다.
$eq: 두 값을 비교하고 값이 동등하거나 그렇지 않을 때 true/false를 반환합니다(...).
변수는 모든 BSON 유형 데이터를 포함할 수 있습니다.변수 값에 액세스하려면 변수 이름 앞에 이중 달러 기호($$)가 붙은 문자열을 사용합니다.
참고:
Justin Jenkin의 답변은 구식이며 여기서 kop의 답변은 컬렉션에서 여러 문서를 반환하지 않습니다.이 집계 쿼리를 사용하면 필요한 경우 여러 문서를 반환할 수 있습니다.
저는 이것이 필요했고 누군가를 돕기 위해 글을 올리고 싶었습니다.
$ 또는 $elemMatch를 사용할 수 있습니다.$ 연산자와 $elemMatch 연산자는 조건에 따라 배열에서 요소의 하위 집합을 투영합니다.
$elemMatch 투영 연산자는 명시적 조건 인수를 사용합니다.이렇게 하면 쿼리에 없는 조건을 기준으로 투영할 수 있습니다.
db.collection.find(
{
// <expression>
},
{
notes: {
$elemMatch: {
title: 'Hello MongoDB'
}
},
name: 1
}
)
$ 연산자는 쿼리 문의 일부 조건을 기준으로 배열 요소를 투영합니다.
db.collection.find(
{
'notes.title': 'Hello MongoDB'
},
{
'notes.title.$': 1,
name: 1
}
)
다음과 같은 쿼리를 수행할 수 있습니다.
db.coll.find({ 'notes.title': 'Hello MongoDB' });
자세한 내용은 문서를 참조하십시오.
언급URL : https://stackoverflow.com/questions/10043965/how-to-get-a-specific-embedded-document-inside-a-mongodb-collection
'programing' 카테고리의 다른 글
webpack://와 webpack-internal://의 차이점은 무엇입니까? (0) | 2023.06.27 |
---|---|
파일 크기를 바이트 단위로 반환하는 VBA Excel 기능 (0) | 2023.06.27 |
EF6 및 SQL Server에서 UniqueKey Violation 예외를 어떻게 탐지할 수 있습니까? (0) | 2023.06.27 |
당기기 위한 깃 후크가 있습니까? (0) | 2023.06.27 |
트리거 본문에서 동일한 테이블에 대한 다른 삭제를 포함하는 삭제 후 트리거를 작성하는 방법은 무엇입니까? (0) | 2023.06.27 |