sql >> Databáze >  >> NoSQL >> MongoDB

Jak získat všechny hodnoty, které obsahují část řetězce pomocí mongoose find?

Na to sis málem odpověděl sám ve svých značkách. MongoDB má $regex operátor, který umožňuje odeslání regulárního výrazu jako dotazu. Takže se dotazujete na řetězce obsahující "Alex" a uděláte toto:

Books.find(
    { "authors": { "$regex": "Alex", "$options": "i" } },
    function(err,docs) { 
    } 
);

Můžete také provést toto:

Books.find(
    { "authors": /Alex/i }, 
    function(err,docs) { 

    }
);

Oba jsou platné a liší se od toho, jak jste se snažili ve správné podporované syntaxi, jak je uvedeno v dokumentaci.

Ale samozřejmě, pokud se ve skutečnosti ptáte "jak získat výsledky 'pole' pouze pro ty, které odpovídají 'Alex' někde v řetězci?" pak je to trochu jiné.

Komplexní shoda pro více než jednu pole element je doménou agregačního rámce (nebo možná mapReduce, ale to je mnohem pomalejší), kde potřebujete "filtrovat" obsah pole.

Začínáš úplně stejně. Klíčem je zde $unwind "dennormalizovat" obsah pole, aby bylo možné správně "filtrovat" jako jednotlivé dokumenty. Poté znovu sestavte pole pomocí „odpovídajících“ dokumentů.

Books.aggregate(
    [
        // Match first to reduce documents to those where the array contains the match
        { "$match": {
            "authors": { "$regex": "Alex", "$options": i }
        }},

        // Unwind to "de-normalize" the document per array element
        { "$unwind": "$authors" },

        // Now filter those document for the elements that match
        { "$match": {
            "authors": { "$regex": "Alex", "$options": i }
        }},

        // Group back as an array with only the matching elements
        { "$group": {
            "_id": "$_id",
            "title": { "$first": "$title" },
            "authors": { "$push": "$authors" },
            "subjects": { "$first": "$subjects" }
        }}
    ],
    function(err,results) {

    }
)


  1. ConnectionMultiplexer.Connect se při připojování k serveru redis přeruší

  2. Najít pomocí _id nefunguje s agregací

  3. Redis Expire nefunguje

  4. Node + Mongoose:Získat poslední vložené ID?