복붙노트

[MONGODB] MongoDB를 일치 $ 유형의 배열?

MONGODB

MongoDB를 일치 $ 유형의 배열?

나는 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. ==============================

    1.실제로 배열에 대해 구체적으로 $ 유형의 문서에 나열된 "잡았다"가있다 :

    실제로 배열에 대해 구체적으로 $ 유형의 문서에 나열된 "잡았다"가있다 :

    그래서, 실제로 테스트되는 것은의 종류를 확인할 수 배열의 "내부 요소"는 "소자 자체가"어레이에 있는지를 검출하는 대신 수단된다.

    이제 문서 자체는 $ 곳이 자바 스크립트 테스트를 제안한다 :

    .find({ "$where": "return Array.isArray(this.author)" })
    

    하지만 더 좋은 방법이 있기 때문에 그 꽤 끔찍한 생각합니다.

    트릭은 $가 존재하는 배열의 0 인덱스 요소에 대한 요구 "점 표기법"에

    .find({ "author.0": { "$exists": true } })
    

    이는 "0 번째"요소 필드가 존재하고, 따라서 데이터 배열 인 것이 존재하는 경우 단지 기본적인 경우이다.

    당신이 그 논리적 전제를 이해하면 그것은 매우 간단 테스트입니다. 그 일치되지 않을 수있는 유일한 방법은 필요한 경우는 자바 스크립트를 대안으로 폴백 할 수있는 경우에 "진정으로 비어"배열입니다. 이 후자의 양식을 사용하는 것이 바람직 할 것이다, 그래서하지만 실제로 인덱스를 사용할 수 있습니다.

  2. ==============================

    2.여기에 원래 무엇을 요구 할 수있는 더 좋은 방법이있다; 즉, 특정 필드가 어레이 형 값을 유지하는 경우 실제로 확인한다 :

    여기에 원래 무엇을 요구 할 수있는 더 좋은 방법이있다; 즉, 특정 필드가 어레이 형 값을 유지하는 경우 실제로 확인한다 :

    .find({ "author": { "$gte": [] } })
    

    잘 문서화 불구하고 배열하여 MongoDB의 $ 유형의 기능은, 2.6 주위에, 위의 쿼리를 사용할 수 있기 때문에, 값이 있는지 여부를이 사용 사례에 대한하지 작업을 확인하는 않습니다 분명 다른 $ 유형 검사 모두와 IMO 일치하고, 어레이 (비어 있거나 없음).

    나는 $를 통해 코드를 실행하는 것은 권장하지 않습니다 경우 때문에 표준 쿼리 구문이 진정으로 작업이 수행되지 않는 한이, 현재 선택된 대답보다는 "더 나은"라고.

    정교하게하려면 $ 곳에 인해 실행 코드에서 인덱스를 사용하는 능력의 부족을 통해 성능을 권장하지 않습니다. 더 세부 사항 : https://docs.mongodb.com/manual/reference/operator/query/where/#considerations

    특별히 비어 있지 않은 배열을 확인하려는 경우 또한, 이것을 사용 :

    .find({ "author": { "$gt": [] } })
    

    기술적으로,이 또한 더 필드가 "0"라는 이름의 필드와 배열이 아닌 객체가 될 수 있으므로 현재의 대답은이 $ 솔루션을 존재에 대응보다, 그 잘못이다 "비는 하늘의 배열"로 일치합니다 그 경우이다.

  3. from https://stackoverflow.com/questions/32512764/mongodb-match-an-array-with-type by cc-by-sa and MIT license