0 szavazat
(15,8e pont) által 

Hogyan kell mongoose-ban olyat, hogy egy kereső string alapján találjon meg egy usert, ahol
- a user néhány attribútuma tartalmazza a kereső string-et substring-ként
- az egyik ilyen attribútum egy tömb, aminek az összes string-jét szeretnénk megvizsgálni, hogy tartalmazza-e a substring-et külön-külön
- utána viszont szeretnénk, ha a mongoose a user objecteket adná vissza és nem csak egy sima objectet, mert szeretnénk mongoose user methodot futtatni rajtuk
- szeretnénk, ha az összes user adat megérkezne, és ha változik a modell, akkor ne kelljen újraírni a scriptet

1 válasz

0 szavazat
(15,8e pont) által 
 
Legjobb válasz

Hát (szinte magától értetődően) így:

User.aggregate([
        /* Match first to reduce documents */
        { "$match": { "$or" : [
            {"authentication.primaryEmail": { "$regex": searchTerm, "$options": "i" }},
            {"authentication.allEmails": { "$regex": searchTerm, "$options": "i" }},
            {"personalData.firstName": { "$regex": searchTerm, "$options": "i" }},
            {"personalData.lastName": { "$regex": searchTerm, "$options": "i" }},
            {"personalData.fullName": { "$regex": searchTerm, "$options": "i" }},
            {"invoicing.company.name": { "$regex": searchTerm, "$options": "i" }}
        ]} },
        /* Unwind to "de-normalize" the document per array element */
        { "$unwind": "$authentication.allEmails" },
        /* Do the filtering */
        { "$match": { "$or" : [
            {"authentication.primaryEmail": { "$regex": searchTerm, "$options": "i" }},
            {"authentication.allEmails": { "$regex": searchTerm, "$options": "i" }},
            {"personalData.firstName": { "$regex": searchTerm, "$options": "i" }},
            {"personalData.lastName": { "$regex": searchTerm, "$options": "i" }},
            {"personalData.fullName": { "$regex": searchTerm, "$options": "i" }},
            {"invoicing.company.name": { "$regex": searchTerm, "$options": "i" }}
        ]} },
        /* Regroup */
        { "$group": {
            "_id": "$_id"
        }}
    ]).exec(function(error1, filteredUsers) {
        if (error1) {
            /* Error handling */
        } else {
            /* Collect user ids */
            var userIds = [];
            for (var i1 = 0; i1 < filteredUsers.length; i1++) {
                userIds.push(filteredUsers[i1]._id);
            }

            /* Do the real query to get mongoose user instances */
            User.find({"_id": {"$in": userIds} }).exec(function (error2, users) {
                if (error2) {
                    /* Error handling */
                } else {
                    /* Do the functionality */
                }
            });
        }
    });
...