Вы могли бы подойти к этому в нескольких направлениях. Первый заключается в использовании числовых индексов массива в ключах объектов запроса с использованием нотации точек и оператора $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" : []
}
}
Я еще не пробовал решение.но одно примечание. Sub_field никогда не будет null. это может быть пустой массив массивов (0). Но никогда не имеет значения. вот где у меня проблема. Я попробую решения и опубликую результаты здесь. – Mobs
Запросы все равно будут работать. Я удалил устаревшие тестовые примеры и могу подтвердить, что результат все тот же. – chridam
Спасибо. хотя я не решил проблему, я в значительной степени убежден, что это путь. когда я попробовал условие «$ where» с параметром «length», я получил сообщение об ошибке: «TypeError: Невозможно прочитать свойство« длина »неопределенного значения« field.sub_field.length ». Я использую Mongodb 2.6.11. есть ли проблемы совместимости? – Mobs