programing

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

megabox 2023. 4. 4. 21:12
반응형

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

이 스키마가 있으면...

person = {
    name : String,
    favoriteFoods : Array
}

...어디서?favoriteFoods배열에 문자열이 채워집니다.몽구스를 사용한 스시를 좋아하는 사람은 어떻게 찾을 수 있을까요?

나는 다음과 같은 것을 바라고 있었다.

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

(이것이 없다는 것을 알고 있습니다.$containsmongodb에서는, 솔루션을 알기 전에 무엇을 찾을 수 있을지를 설명하고 있습니다.)

~하듯이favouriteFoods는 단순한 문자열 배열입니다.이 필드를 직접 조회할 수 있습니다.

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

또한 스키마에서 문자열 배열을 명시하는 것이 좋습니다.

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

관련 매뉴얼은 https://docs.mongodb.com/manual/tutorial/query-arrays/ 에서 찾을 수 있습니다.

거기에는 없다$containsmongodb의 오퍼레이터.

쟈니 씨의 답변을 이용하실 수 있습니다.HK로 하면 된다.몽고의 가장 가까운 비유는$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/ 를 체크해 주세요.

어레이에 객체가 포함되어 있는 경우(예: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

$inOR과 같은$allAND처럼요.상세한 것에 대하여는, 다음의 링크를 참조해 주세요.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

반응형