简体   繁体   中英

(mongoDB) find with empty or null values

how to make a mongodb collection find (db.collection.find) with empty values?

currently i have:

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)
});

but it returns an empty array, because "name" or "text" is null / an empty string, i want that it query only the values that have something specified or ignore it (like content.name is something in it or its empty)

how do i get it? i already searched ... but didnt found something

thanks!

( already testet mongoDB : multi value field search ignoring null fields )

Versions: Node: 8.9.0 (npm) mongodb: 2.2.33 mongodb: 3.4

Try using $and, $or operators. Something like.

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)
});
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 }
            ]
        }
    ]
})

Edited:

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 and empty is different, you need to add one more condition for empty string in query.

Logical Query Operators

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM