2010-05-25 13 views
13

Voglio regex cercare un valore intero in MongoDB. È possibile?Ricerca Rego MongoDB su Valore intero

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

considerare:

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

Come potete vedere, inserisco un oggetto e sono in grado di trovare per il valore. Se provo una regex semplice, non riesco a trovare l'oggetto.

Grazie!

risposta

35

Se si desidera eseguire una corrispondenza di modello su numeri, il modo di farlo in mongo è utilizzare l'espressione $ where e passare una corrispondenza di modello.

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

Come una punta non correlata, per fare questo lavoro in PHP, è necessario passare in Array ('$ dove' => new MongoCode (/^123 * /. .test (this.example) "); –

+2

@dalton Solo curioso qui, l'operatore regex $ non sarebbe più efficiente di $ dove? – talentedmrjones

+0

Capito che qualcosa di simile si applicherebbe per il driver Ruby come @gary ha sottolineato ma no. Questo dovrebbe funzionare come un fascino db.test.find ("$ where" => "/^123.*/.test(this.example)") – Vivek

3

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

Detto questo, il modo migliore per farlo è $project il tuo documento e aggiungere un altro campo calcolato che è il valore stringa del tuo numero.

Il $toLower e il suo fratello $toUpper rispettivamente convertono una stringa in lettere minuscole e maiuscole ma hanno una piccola funzione sconosciuta che è quella che possono essere utilizzate per convertire i numeri interi in stringa.

L'operatore $match restituisce tutti i documenti corrispondenti al modello utilizzando l'operatore .

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

che produce:

{ 
    "_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 stesura di questo documento) utilizzando l'operatore $redact che consente l'elaborazione logica itional $cond. $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 
}