특정 값을 포함하는 배열이 있는 문서 찾기
이 스키마가 있으면...
person = {
name : String,
favoriteFoods : Array
}
...어디서?favoriteFoods
배열에 문자열이 채워집니다.몽구스를 사용한 스시를 좋아하는 사람은 어떻게 찾을 수 있을까요?
나는 다음과 같은 것을 바라고 있었다.
PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});
(이것이 없다는 것을 알고 있습니다.$contains
mongodb에서는, 솔루션을 알기 전에 무엇을 찾을 수 있을지를 설명하고 있습니다.)
~하듯이favouriteFoods
는 단순한 문자열 배열입니다.이 필드를 직접 조회할 수 있습니다.
PersonModel.find({ favouriteFoods: "sushi" }, ...); // favouriteFoods contains "sushi"
또한 스키마에서 문자열 배열을 명시하는 것이 좋습니다.
person = {
name : String,
favouriteFoods : [String]
}
관련 매뉴얼은 https://docs.mongodb.com/manual/tutorial/query-arrays/ 에서 찾을 수 있습니다.
거기에는 없다$contains
mongodb의 오퍼레이터.
쟈니 씨의 답변을 이용하실 수 있습니다.HK로 하면 된다.몽고의 가장 가까운 비유는$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/ 를 체크해 주세요.
어레이에 객체가 포함되어 있는 경우(예: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 }
})
lookup_food_array의 경우는 어레이입니다.
match_stage["favoriteFoods"] = {'$elemMatch': {'$in': lookup_food_array}}
lookup_food_array는 문자열입니다.
match_stage["favoriteFoods"] = {'$elemMatch': lookup_food_string}
find()와 동의하지만 사용 예에서는 가장 효과적입니다.여전히 $match의 집약 프레임워크가 존재하기 때문에 다수의 엔트리에 대한 조회가 용이해지고 특히 새로운 파일의 그룹화와 작성에 있어서 중요한 결과를 얻을 수 있습니다.
PersonModel.aggregate([ { "$match": { $and : [{ 'favouriteFoods' : { $exists: true, $in: [ 'sushi']}}, ........ ] } }, { $project : {"_id": 0, "name" : 1} } ]);
이것을 달성하는 몇 가지 방법이 있다.첫 번째는$elemMatch
연산자:
const docs = await Documents.find({category: { $elemMatch: {$eq: 'yourCategory'} }});
// you may need to convert 'yourCategory' to ObjectId
두 번째는요.$in
또는$all
연산자:
const docs = await Documents.find({category: { $in: [yourCategory] }});
또는
const docs = await Documents.find({category: { $all: [yourCategory] }});
// you can give more categories with these two approaches
//and again you may need to convert yourCategory to ObjectId
$in
OR과 같은$all
AND처럼요.상세한 것에 대하여는, 다음의 링크를 참조해 주세요.https://docs.mongodb.com/manual/reference/operator/query/all/
번째 은 ★★★★★★★★★★★★★★★★★★★★.aggregate()
★★★★
const docs = await Documents.aggregate([
{ $unwind: '$category' },
{ $match: { 'category': mongoose.Types.ObjectId(yourCategory) } }
]};
aggregate()를 사용하면 카테고리 배열에서 카테고리 ID를 하나만 얻을 수 있습니다.
이 코드 조각은 특정 카테고리를 가진 문서를 검색해야 했던 프로젝트에서 가져온 것입니다. 따라서 필요에 따라 쉽게 커스터마이즈할 수 있습니다.
Loopback3의 경우 제시된 모든 예제가 효과가 없었거나 REST API를 사용하는 것만큼 빠르지 않았습니다.하지만 그것은 내가 필요한 정확한 답을 알아내는 데 도움이 되었다.
{"where":{"arrayAttribute":{ "all" :[String]}}}
[ objects ]에서 [Array of objects]를 사용할 수 .$elemMatch
§:
PersonModel.find({ favoriteFoods : { $elemMatch: { name: "sushiOrAnytthing" }}});
이 코드는 poople & $ in으로 설정하면 편리합니다.
ServiceCategory.find().populate({
path: "services",
match: { zipCodes: {$in: "10400"}},
populate: [
{
path: "offers",
},
],
});
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
'programing' 카테고리의 다른 글
워드프레스의 레지스터 분류법에서 ep 마스크는 정확히 어떤 기능을 합니까? (0) | 2023.04.04 |
---|---|
MySQL의 최대 JSON 열 길이 (0) | 2023.04.04 |
ng-style을 사용하여 div 너비를 설정하는 방법 (0) | 2023.04.04 |
오브젝트 배열의 인터페이스를 정의하려면 어떻게 해야 합니까? (0) | 2023.04.04 |
Node.js에서 문자열을 json으로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.04 |