development

특정 값을 포함하는 배열이있는 문서 찾기

big-blog 2020. 2. 17. 22:21
반응형

특정 값을 포함하는 배열이있는 문서 찾기


이 스키마가 있다면 ...

person = {
    name : String,
    favoriteFoods : Array
}

... favoriteFoods어레이는 문자열로 채워집니다. 몽구스를 사용하여 좋아하는 음식으로 "초밥"을 가진 모든 사람을 어떻게 찾을 수 있습니까?

나는 다음 줄을 따라 무언가를 바랐다.

PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});

( $containsmongodb에는 솔루션이 없다는 것을 알기 전에 찾을 것으로 예상되는 것을 설명하는 것이 없다는 것을 알고 있습니다)


favouriteFoods문자열의 간단한 배열입니다, 당신은 단지 해당 필드를 직접 조회 할 수 있습니다 :

PersonModel.find({ favouriteFoods: "sushi" }, ...);

그러나 스키마에서 문자열 배열을 명시 적으로 만드는 것이 좋습니다.

person = {
    name : String,
    favouriteFoods : [String]
}

관련 문서는 https://docs.mongodb.com/manual/tutorial/query-arrays/ 에서 찾을 수 있습니다.


$containsmongodb 에는 연산자 가 없습니다 .

JohnnyHK의 답변을 그대로 사용할 수 있습니다. 그 mongo가 포함하는 가장 가까운 유추는 $in이것을 사용하여 쿼리는 다음과 같습니다.

PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);

$all이 상황에서는 더 적절할 것 같습니다 . 스시에있는 사람을 찾고 있다면 :

PersonModel.find({ favoriteFood : { $all : ["sushi"] }, ...})

더 많은 검색을 필터링하려면 다음과 같이하십시오.

PersonModel.find({ favoriteFood : { $all : ["sushi", "bananas"] }, ...})

$inOR과 $allAND 같습니다. 이것을 확인하십시오 : https://docs.mongodb.com/manual/reference/operator/query/all/


예를 들어 배열에 객체가 포함 된 경우 if favouriteFoods는 다음과 같은 객체의 배열입니다.

{
  name: 'Sushi',
  type: 'Japanese'
}

다음 쿼리를 사용할 수 있습니다.

PersonModel.find({"favouriteFoods.name": "Sushi"});

하위 문서 배열 내에서 NULL 요소가 포함 된 문서를 찾아야하는 경우이 쿼리는 꽤 잘 작동합니다.

db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})

이 게시물은이 게시물에서 가져옵니다 : null 값을 가진 MongoDb 쿼리 배열

그것은 훌륭한 발견이었고 내 자신의 초기 및 잘못된 버전 보다 훨씬 잘 작동합니다 (하나의 요소가있는 배열에서만 잘 작동하는 것으로 나타났습니다).

.find({
    'MyArrayOfSubDocuments': { $not: { $size: 0 } },
    'MyArrayOfSubDocuments._id': { $exists: false }
})

find ()에 동의하는 것이 사용 사례에서 가장 효과적입니다. 여전히 많은 수의 항목에 대한 쿼리를 용이하게하고 특히 새 파일을 그룹화하고 작성하는 데 가치가있는 적은 수의 결과를 생성하기 위해 집계 프레임 워크에 $ match가 있습니다.

  PersonModel.aggregate([
            { 
                 "$match": { 
                     $and : [{ 'favouriteFoods' : { $exists: true, $in: [ 'sushi']}}, ........ ]  }
             },
             { $project : {"_id": 0, "name" : 1} }
            ]);

lookup_food_array의 경우 배열입니다.

match_stage["favoriteFoods"] = {'$elemMatch': {'$in': lookup_food_array}}

lookup_food_array의 경우 문자열입니다.

match_stage["favoriteFoods"] = {'$elemMatch': lookup_food_string}

Loopback3의 경우 주어진 모든 예제가 나에게 적합하지 않거나 REST API를 사용하는 것만 큼 빠릅니다. 그러나 그것은 내가 필요한 정확한 답을 찾는 데 도움이되었습니다.

{"where":{"arrayAttribute":{ "all" :[String]}}}


javascript를 통해 "contains"연산자와 같은 것을 사용하려면 항상 정규 표현식을 사용할 수 있습니다.

예. 이름이 "Bartolomew"인 고객을 검색하려고한다고 가정하십시오.

async function getBartolomew() {
    const custStartWith_Bart = await Customers.find({name: /^Bart/ }); // Starts with Bart
    const custEndWith_lomew = await Customers.find({name: /lomew$/ }); // Ends with lomew
    const custContains_rtol = await Customers.find({name: /.*rtol.*/ }); // Contains rtol

    console.log(custStartWith_Bart);
    console.log(custEndWith_lomew);
    console.log(custContains_rtol);
}

나는이 주제가 오래되었다는 것을 알고 있지만 같은 질문을 궁금해 할 수있는 미래의 사람들에게는 또 다른 비효율적 인 해결책이있을 수 있습니다.

PersonModel.find({$where : 'this.favouriteFoods.indexOf("sushi") != -1'});

이것은 MongoDB에 의한 모든 최적화를 피하므로 프로덕션 코드에는 사용하지 마십시오.

참고 URL : https://stackoverflow.com/questions/18148166/find-document-with-array-that-contains-a-specific-value



도와주세요.
반응형