2017-11-15 21 views
0

Wie mache ich eine Mongodb-Sammlung find (db.collection.find) mit leeren Werten?(mongoDB) Suche mit leeren oder Null-Werten

zur Zeit ich habe:

function test(s) { 
    if (!s) { 
     return null; 
    } else { 
     return s; 
    } 
} 

var content = { 
    date: { 
     from: '2017-10-15', 
     to: '2017-11-15' 
    }, 

    'name': 'some text', //this can be null or empty 
    'text': 'some other text' //this can be null or empty 
} 

col.find({ 
    "date": { 
     $gte: new Date(content.date.from), 
     $lte: new Date(content.date.to) 
    }, 

    "name": { 
     $ne: { 
      $type: null 
     }, 

     $eq: test(content.name) 
    }, 

    "text": { 
     $ne: { 
      $type: null 
     }, 

     $eq: test(content.text) 
    }, 
}).toArray((err, items) => { 
    console.log(items) 
}); 

aber es gibt eine leere Array, weil „name“ oder „text“ ist null/eine leere Zeichenkette, ich will, dass es Abfrage nur die Werte, die etwas angegeben haben oder es ignorieren (wie content.name ist etwas darin oder ist es leer)

wie bekomme ich es? ich suchte bereits ... aber fand nicht etwas

danke!

(Getestet bereits mongoDB : multi value field search ignoring null fields)

Versionen: Knoten: 8.9.0 (NPM) mongodb: 2.2.33 mongodb: 3.4

Antwort

0

Versuchen $ und $ oder Operatoren. Etwas wie.

col.find({ 
$and:[ 
    {"date": {$gte: new Date(content.date.from),$lte: new Date(content.date.to)}}, 
    {"$or":[{"name": {$ne: {$type: null}}},{"name":test(content.name)}]}, 
    {"$or":[{"text": {$ne: {$type: null}}},{"text":test(content.text)}]} 
] 
}).toArray((err, items) => { 
    console.log(items) 
}); 
+0

zu machen tryed, wenn "name" etwas (außer leer) ist, findet er immer noch alle anderen, wie i "t1" haben, "T2" und die Suche nach dem "t1" findet nach wie vor „t2 "(Name) – hasezoey

+0

was ich im Treiber sehe, ist, dass es automatisch" $ und "macht, wenn es benötigt wird, und die" $ oder "... ich readed die docs, aber fand es nicht nützlich/fand nichts, was könnte help – hasezoey

0
col.find({ 
    $and: [ 
     { 
      $and: [ 
       { 
        "date": { 
         $gte: new Date(content.date.from) 
        } 
       }, 
       { 
        "date": { 
         $lte: new Date(content.date.to) 
        } 
       }, 
      ] 
     }, 
     { 
      $or: [ 
       { 'name': null }, 
       { 'name': content.name } 
      ] 
     }, 
     { 
      $or: [ 
       { 'text': null }, 
       { 'text': content.text } 
      ] 
     } 
    ] 
}) 

Editiert:

col.find({ 
    $and: [ 
     { 
      $and: [ 
       { 
        "date": { 
         $gte: new Date(content.date.from) 
        } 
       }, 
       { 
        "date": { 
         $lte: new Date(content.date.to) 
        } 
       }, 
      ] 
     }, 
     { 
      $or: [ 
       { 'name': null }, 
       { 'name':'' } 
       { 'name': content.name } 
      ] 
     }, 
     { 
      $or: [ 
       { 'text': null }, 
       { 'text': '' }, 
       { 'text': content.text } 
      ] 
     } 
    ] 
}) 

null und empty anders ist, müssen Sie eine weitere Bedingung für die leere Zeichenfolge in Abfrage hinzuzufügen.

Logical Query Operators

+0

mit diesem hier, es antwortet immer mit leer (array, wenn .toArray), ich habe bereits gelesen, fand ich nichts nützliches in der Betreiberliste .... – hasezoey

+0

Diese Abfrage sieht ziemlich korrekt zu mir, so dass Sie vielleicht beginnen möchten Wenn Sie keine Filter verwenden, sehen Sie, ob etwas zurückkommt, und fügen Sie dann die Filter Schritt für Schritt hinzu, um zu sehen, welche die Ursache ist leeres Array. – dnickless

+0

Auch für mich funktioniert das nur, wenn "content.name" & "content.text" einen Wert hat ... (wenn nur eines oder nichts von ihnen definiert oder leer ist, antwortet es immer mit einem leeren Array) – hasezoey