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

이 스키마가 있다면 …

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}