특정 값을 포함하는 배열이있는 문서 찾기
이 스키마가 있다면 ...
person = {
name : String,
favoriteFoods : Array
}
... favoriteFoods
어레이는 문자열로 채워집니다. 몽구스를 사용하여 좋아하는 음식으로 "초밥"을 가진 모든 사람을 어떻게 찾을 수 있습니까?
나는 다음 줄을 따라 무언가를 바랐다.
PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});
( $contains
mongodb에는 솔루션이 없다는 것을 알기 전에 찾을 것으로 예상되는 것을 설명하는 것이 없다는 것을 알고 있습니다)
로 favouriteFoods
문자열의 간단한 배열입니다, 당신은 단지 해당 필드를 직접 조회 할 수 있습니다 :
PersonModel.find({ favouriteFoods: "sushi" }, ...);
그러나 스키마에서 문자열 배열을 명시 적으로 만드는 것이 좋습니다.
person = {
name : String,
favouriteFoods : [String]
}
관련 문서는 https://docs.mongodb.com/manual/tutorial/query-arrays/ 에서 찾을 수 있습니다.
$contains
mongodb 에는 연산자 가 없습니다 .
JohnnyHK의 답변을 그대로 사용할 수 있습니다. 그 mongo가 포함하는 가장 가까운 유추는 $in
이것을 사용하여 쿼리는 다음과 같습니다.
PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);
$all
이 상황에서는 더 적절할 것 같습니다 . 스시에있는 사람을 찾고 있다면 :
PersonModel.find({ favoriteFood : { $all : ["sushi"] }, ...})
더 많은 검색을 필터링하려면 다음과 같이하십시오.
PersonModel.find({ favoriteFood : { $all : ["sushi", "bananas"] }, ...})
$in
OR과 $all
AND 와 같습니다. 이것을 확인하십시오 : 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
도와주세요.
'development' 카테고리의 다른 글
요소 전용 CSS 스타일 재설정 / 제거 (0) | 2020.02.17 |
---|---|
현재 실행중인 메소드의 이름 얻기 (0) | 2020.02.17 |
jQuery : 아약스 호출 성공 후 데이터 반환 (0) | 2020.02.17 |
MySQL에서 열의 데이터 유형을 어떻게 변경합니까? (0) | 2020.02.17 |
JavaScript에서 유휴 시간을 우아하게 감지하는 방법은 무엇입니까? (0) | 2020.02.17 |