Domanda

Voglio regex cercare un valore intero in MongoDB. È possibile?

Sto costruendo un'interfaccia di tipo CRUD che permette * per i caratteri jolly nei diversi settori. Sto cercando di mantenere l'interfaccia utente coerente per alcuni campi che sono interi.

Si consideri:

> db.seDemo.insert({ "example" : 1234 });
> db.seDemo.find({ "example" : 1234 });
{ "_id" : ObjectId("4bfc2bfea2004adae015220a"), "example" : 1234 }
> db.seDemo.find({ "example" : /^123.*/ });
> 

Come potete vedere, ho inserire un oggetto e io sono in grado di trovare per il valore. Se provo una semplice espressione regolare, che attualmente non posso trovare l'oggetto.

Grazie!

È stato utile?

Soluzione

Se si vogliono fare un match modello sui numeri, il modo per farlo in Mongo è usare l'espressione $ dove e passare in un match modello.

> db.test.find({ $where: "/^123.*/.test(this.example)" })
{ "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 }

Altri suggerimenti

Io non sono un grande fan di utilizzare il $where interrogazione operatore a causa del modo in cui valuta l'espressione di query, non fa uso di indici e il rischio per la sicurezza se la query utilizza i dati di input utente.

A partire da MongoDB 4.2 è possibile utilizzare il $regexMatch|$regexFind|$regexFindAll disponibile in MongoDB 4.1.9+ e il $expr per fare questo.

let regex = /123/;
  • $regexMatch e $regexFind

    db.col.find({
        "$expr": {
            "$regexMatch": {
               "input": {"$toString": "$name"}, 
               "regex": /123/ 
            }
        }
    })
    
  • $regexFinAll

    db.col.find({
        "$expr": {
            "$gt": [
                { 
                    "$size": { 
                        "$regexFindAll": { 
                            "input": {"$toString": "$name"}, 
                            "regex": "123" 
                        }
                    }
                }, 
                0
            ]
        }
    })
    

Da MongoDB 4.0 è possibile utilizzare l'operatore $toString che è un wrapper per l'operatore $convert a stringa i interi.

db.seDemo.aggregate([ 
    { "$redact": { 
        "$cond": [ 
            { "$gt": [ 
                { "$indexOfCP": [ 
                    { "$toString": "$example" }, 
                    "123" 
                ] }, 
                -1 
            ] }, 
            "$$KEEP", 
            "$$PRUNE" 
        ] 
    }}
])

Se quello che vuoi è di recuperare tutti i documenti che contengono una particolare stringa, a partire dalla versione 3.4, è possibile utilizzare il $redact operatore che permette un $cond pre- sentano logica processing.$indexOfCP.

db.seDemo.aggregate([ 
    { "$redact": { 
        "$cond": [ 
            { "$gt": [ 
                { "$indexOfCP": [ 
                    { "$toLower": "$example" }, 
                    "123" 
                ] }, 
                -1 
            ] }, 
            "$$KEEP", 
            "$$PRUNE" 
        ] 
    }}
])

che produce:

{ 
    "_id" : ObjectId("579c668c1c52188b56a235b7"), 
    "example" : 1234 
}

{ 
    "_id" : ObjectId("579c66971c52188b56a235b9"), 
    "example" : 12334 
}

Prima di MongoDB 3.4, è necessario $project tua documento e aggiungere un altro campo calcolato che è il valore della stringa del vostro numero.

Il $toLower e suo fratello operatori $toUpper nofollow noreferrer convertire, rispettivamente, una stringa in caratteri minuscoli e maiuscoli, ma hanno una caratteristica poco sconosciuto che è che possono essere usati per convertire un numero intero a stringa.

$match restituisce operatore tutti quei documenti che corrispondono alla vostra modello utilizzando l'operatore $regex .

db.seDemo.aggregate(
    [ 
        { "$project": { 
            "stringifyExample": { "$toLower": "$example" }, 
            "example": 1 
        }}, 
        { "$match": { "stringifyExample": /^123.*/ } }
    ]
)

che i rendimenti:

{ 
    "_id" : ObjectId("579c668c1c52188b56a235b7"), 
    "example" : 1234,
    "stringifyExample" : "1234"
}

{ 
    "_id" : ObjectId("579c66971c52188b56a235b9"), 
    "example" : 12334,
    "stringifyExample" : "12334"
}

Ora, se quello che vuoi è di recuperare tutti i documenti che contengono una particolare stringa, il modo più facile e migliore per farlo è nel prossimo rilascio di MongoDB (al momento della scrittura) utilizzando il $redact operatore che permette un $cond pre- sentano logica processing.$indexOfCP.

db.seDemo.aggregate([ 
    { "$redact": { 
        "$cond": [ 
            { "$gt": [ 
                { "$indexOfCP": [ 
                    { "$toLower": "$example" }, 
                    "123" 
                ] }, 
                -1 
            ] }, 
            "$$KEEP", 
            "$$PRUNE" 
        ] 
    }}
])
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top