Mongo + PHP Query如何检查字段是否为空

时间:2016-01-06 03:37:22

标签: php arrays mongodb null size

数据:

"field1" : { "sub_field" : [ ]}

我想写一个查询来检查' sub_field'是空的。

这就是我的尝试:

$cursor = $collection->find( array('field1.sub_field' => array('$ne' => null))

显然它给出了结果,因为Array不为null(我在无效中尝试了null和空格)。

我被告知' $ size'运算符可用于实现此目的。但到目前为止我没有运气。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

对于find type null或undefined字段,您可以使用:

对于undefined:

db.getCollection('your_collection_name').find({ yuorField: { $type: 6 } })

对于null:

db.getCollection('your_collection_name').find({ yuorField: { $type: 10 } })

答案 1 :(得分:1)

你可以通过几种方式解决这个问题。第一种是使用点表示法和 $exists 运算符在查询对象键中使用数值数组索引,以搜索至少不具有sub_field的所有文档数组元素:

var cursor = db.collection.find({ "field1.sub_field.0": { "$exists": false } })

应该转换为PHP

$cursor = $collection->find( array("field1.sub_field.0" => array("$exists" => false))

另一种方法是将 $size 运算符与 $exists 运算符一起使用,所有运算符都包含在 {{3 }} 运算符,用于查找没有sub_field不存在或空数组的所有文档:

var cursor = db.collection.find({
    "$or": [
        { "field1.sub_field": { "$exists": false } },
        { "field1.sub_field": { "$size": 0 } }
    ]
});

您可以考虑使用性能较慢的另一种方法是使用 $or 运算符:

var cursor = db.collection.find({       
    "$where": "this.field1.sub_field.length == 0"   
});

对于基准测试,请尝试填充测试集合:

db.test.insert([       
    { field1: { sub_field: [] } },
    { field1: { sub_field: [ "foo" ] } },
    { field1: { sub_field: [ "foo", "bar" ] } }
]);

> db.test.find({ "field1.sub_field.0": { "$exists": false } })
> db.test.find({
    "$or": [
        { "field1.sub_field": { "$exists": false } },
        { "field1.sub_field": { "$size": 0 } }
    ]
})
> db.test.find({ "$where": "this.field1.sub_field.length == 0" })

所有三个查询都将生成具有空sub_field数组的文档:

/* 0 */
{
    "_id" : ObjectId("568ccec3653d87e43482c4d0"),
    "field1" : {
        "sub_field" : []
    }
}