2016-01-06 5 views
0

данных:Монго + PHP запрос Как проверить, если поле пустое

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

Я хочу написать запрос, чтобы проверить, если «sub_field» пуст или нет.

Это то, что я пробовал:

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

Очевидно, что это дает результаты, как массив не пустой (я пытался утратившим пустое пространство в бесполезности).

Мне сказали, что для достижения этого может использоваться оператор $ size. но до сих пор мне не повезло.

Любые предложения?

ответ

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 ОПЕ rator все обернутые в $or оператора в, чтобы найти все документы без sub_field либо не существует или пустой массив:

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

Другой подход можно рассмотреть хотя и с меньшей продуктивностью, будет использовать оператор в $where:

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" : [] 
    } 
} 
+0

Я еще не пробовал решение.но одно примечание. Sub_field никогда не будет null. это может быть пустой массив массивов (0). Но никогда не имеет значения. вот где у меня проблема. Я попробую решения и опубликую результаты здесь. – Mobs

+0

Запросы все равно будут работать. Я удалил устаревшие тестовые примеры и могу подтвердить, что результат все тот же. – chridam

+0

Спасибо. хотя я не решил проблему, я в значительной степени убежден, что это путь. когда я попробовал условие «$ where» с параметром «length», я получил сообщение об ошибке: «TypeError: Невозможно прочитать свойство« длина »неопределенного значения« field.sub_field.length ». Я использую Mongodb 2.6.11. есть ли проблемы совместимости? – Mobs

1

для типа находки нулевого или неопределенного поля вы можете использовать это: неопределенные:

db.getCollection ('your_collection_name') находят. ({YuorField: {$ Типа: 6}})

нуля :.

db.getCollection ('your_collection_name') находим ({yuorField: {$ Тип: 10}})

+0

его не случай нулевого значения. его случай пустого массива. Как мы проверим, пустой ли массив в запросе? – Mobs

+0

Решение отлично работает с NULL. Однако я предполагаю, что пустой массив не эквивалентен «undefined». Возврат всегда пуст для проверок $ Type 6. – Mobs

+0

он просто проверяет неопределенные и нулевые поля. –

Смежные вопросы