[MONGODB] MongoDB를 일치 $ 유형의 배열?
MONGODBMongoDB를 일치 $ 유형의 배열?
나는 MongoDB를 수집 284.116 트윗이 포함되어 있습니다. 문제는 일부 개체의 "저자"필드는 객체 유형에 있지만 배열 유형에 현장에서 다른 개체 -이 "저자"이다. 문제는 그래서 나는 배열되는 사람 필터링 할, 그리고 어떤 사람은 객체입니다.
예를 들면 : 저자 필드의 유형은 객체입니다.
{
"_id" : ObjectId("55edfbd11a87d41d987a6dc1"),
"tweet" : "Back in my dorm, yay!",
"uri" : "https://twitter.com/natalylug0/status/640994018529181696",
"date" : "2015-09-08 00:04:17",
"country" : "U.S.A.",
"city" : "Texas",
"state" : "Dallas",
"author" : {
"username" : "Nataly",
"uri" : "https://twitter.com/natalylug0",
"screenname" : "natalylug0"
}
}
그리고 다른 하나 : 저자 필드의 유형은 배열입니다.
{
"_id" : ObjectId("55ee3a00e11fbb1030d659fe"),
"author" : [
{
"username" : "Relapsed Shini",
"uri" : "https://twitter.com/iPictoraL",
"screenname" : "iPictoraL"
}
],
"tweet" : "@zumbiezuza 😍😍😍💚 ily zoeeeeeeee",
"uri" : "https://twitter.com/iPictoraL/status/641060812140900352",
"date" : "2015-09-08 01:29:42",
"country" : "U.S.A.",
"city" : "Texas",
"state" : "Dallas"
}
그래서 나는 다음과 같은 쿼리를 실행 :
db.getCollection('tweets').find({ author: { $type: 4} })
그리고 내가 무엇을 얻을 것은
Fetched 0 record(s)
$ 유형을 실행한다면 : 3 나는이 컬렉션의 크기의 같은 값 284.116 값을 얻는다.
내 질문은 그래서, 나는 "저자"필드 배열을 포함하는 개체를 필터링하는 방법에 대해 설명합니다.
해결법
-
==============================
1.실제로 배열에 대해 구체적으로 $ 유형의 문서에 나열된 "잡았다"가있다 :
실제로 배열에 대해 구체적으로 $ 유형의 문서에 나열된 "잡았다"가있다 :
그래서, 실제로 테스트되는 것은의 종류를 확인할 수 배열의 "내부 요소"는 "소자 자체가"어레이에 있는지를 검출하는 대신 수단된다.
이제 문서 자체는 $ 곳이 자바 스크립트 테스트를 제안한다 :
.find({ "$where": "return Array.isArray(this.author)" })
하지만 더 좋은 방법이 있기 때문에 그 꽤 끔찍한 생각합니다.
트릭은 $가 존재하는 배열의 0 인덱스 요소에 대한 요구 "점 표기법"에
.find({ "author.0": { "$exists": true } })
이는 "0 번째"요소 필드가 존재하고, 따라서 데이터 배열 인 것이 존재하는 경우 단지 기본적인 경우이다.
당신이 그 논리적 전제를 이해하면 그것은 매우 간단 테스트입니다. 그 일치되지 않을 수있는 유일한 방법은 필요한 경우는 자바 스크립트를 대안으로 폴백 할 수있는 경우에 "진정으로 비어"배열입니다. 이 후자의 양식을 사용하는 것이 바람직 할 것이다, 그래서하지만 실제로 인덱스를 사용할 수 있습니다.
-
==============================
2.여기에 원래 무엇을 요구 할 수있는 더 좋은 방법이있다; 즉, 특정 필드가 어레이 형 값을 유지하는 경우 실제로 확인한다 :
여기에 원래 무엇을 요구 할 수있는 더 좋은 방법이있다; 즉, 특정 필드가 어레이 형 값을 유지하는 경우 실제로 확인한다 :
.find({ "author": { "$gte": [] } })
잘 문서화 불구하고 배열하여 MongoDB의 $ 유형의 기능은, 2.6 주위에, 위의 쿼리를 사용할 수 있기 때문에, 값이 있는지 여부를이 사용 사례에 대한하지 작업을 확인하는 않습니다 분명 다른 $ 유형 검사 모두와 IMO 일치하고, 어레이 (비어 있거나 없음).
나는 $를 통해 코드를 실행하는 것은 권장하지 않습니다 경우 때문에 표준 쿼리 구문이 진정으로 작업이 수행되지 않는 한이, 현재 선택된 대답보다는 "더 나은"라고.
정교하게하려면 $ 곳에 인해 실행 코드에서 인덱스를 사용하는 능력의 부족을 통해 성능을 권장하지 않습니다. 더 세부 사항 : https://docs.mongodb.com/manual/reference/operator/query/where/#considerations
특별히 비어 있지 않은 배열을 확인하려는 경우 또한, 이것을 사용 :
.find({ "author": { "$gt": [] } })
기술적으로,이 또한 더 필드가 "0"라는 이름의 필드와 배열이 아닌 객체가 될 수 있으므로 현재의 대답은이 $ 솔루션을 존재에 대응보다, 그 잘못이다 "비는 하늘의 배열"로 일치합니다 그 경우이다.
from https://stackoverflow.com/questions/32512764/mongodb-match-an-array-with-type by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 시간에 의해 MongoDB의 그룹 (0) | 2019.12.20 |
---|---|
[MONGODB] MongoDB의 로컬 시간대에서 집계 (0) | 2019.12.19 |
[MONGODB] 어떻게 원자 조작으로 하나 개의 문서에 부울 필드를 전환하려면? (0) | 2019.12.19 |
[MONGODB] 업데이트 arrayFilters와 MongoDB를에서 하위 문서를 중첩 (0) | 2019.12.19 |
[MONGODB] 항상 임베디드와 엠버 데이터 다중 계층 구조 (0) | 2019.12.19 |