sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur säger man... matcha när fältet är ett nummer... i mongodb?

Använd $type operatorn i din $match :

db.zips.aggregate([
    {$project : {city:{$substr:["$city",0,1]}}},
    {$sort : {city : 1}}, 
    {$match: {city: {$type: 16}}}      // city is a 32-bit integer
]);

Det finns inte ett enda typvärde för nummer så du måste veta vilken typ av nummer du har:

32-bit integer   16
64-bit integer   18
Double           1

Eller använd en $or operator för att matcha alla typer av nummer:

db.zips.aggregate([
    {$project : {city:{$substr:["$city",0,1]}}},
    {$sort : {city : 1}}, 
    {$match: {$or: [{city: {$type: 1}}, {city: {$type: 16}}, {city: {$type: 18}}]}}
]);

Eller till och med använd $not för att matcha alla dokument där city är inte en sträng:

db.zips.aggregate([
    {$project : {city:{$substr:["$city",0,1]}}},
    {$sort : {city : 1}}, 
    {$match: {city: {$not: {$type: 2}}}}      // city is not a string
]);

UPPDATERAD

För att matcha alla dokument där city är en numerisk sträng som du kan använda ett reguljärt uttryck:

db.zips.aggregate([
    {$project : {city:{$substr:["$city",0,1]}}},
    {$sort : {city : 1}}, 
    {$match: {city: /^\d.*$/}}      // city is all digits
]);


  1. Hur kan Redis sortera efter två olika sorterade uppsättningar?

  2. Kedjetidsbaserad sorterings- och gränsproblem

  3. Mongoosepopulation vs aggregat

  4. Hur många samlingar är möjliga i en MongoDB utan att förlora prestanda?