MongoDB - найти все документы, где размер массива / списка больше N
Просмотрите следующие документы:
Коллекция: домен
{
"_id" : 1001,
"domainName" : "google.com"
"tag" : [
"search engine",
"search",
"find anything",
"giant"
]
},
{
"_id" : 1002,
"domainName" : "yahoo.com"
"tag" : [
"search engine",
"online portal",
]
},
{
"_id" : 1003,
"domainName" : "example.com"
}
1. Вопрос
Как найти все документы, где размер «тега» больше 3?
# 1.1 Попробуйте объединить$size и$gt следующим образом:
db.domain.find( { tag: {$size: {$gt:3} } } );
null
Нет ошибки, но он всегда будет возвращать ноль, кажется, MongoDB не работает, как это.
# 1.2 Попробуйте использовать оператор$where.
db.domain.find( {$where:'this.tag.length>3'} )
MongoDB v 2.2.3
uncaught exception: error {
"$err" : "error on invocation of $where function:\nJS Error: TypeError: this.tag has no properties nofile_a:0",
"code" : 10071
}
or
MongoDB v 2.4.5
JavaScript execution failed: error: {
"$err" : "JavaScript execution failed: TypeError: Cannot read property 'length' of undefined
near '' ",
"code" : 16722
} at src/mongo/shell/query.js:L128
>
Похоже, оператор$where тоже не работает?
2. Решение
На самом деле оператор$where работает нормально, просто не все документы содержат поле «тег» и вызвали ошибку «нет свойств».
2.1 To fix it, try combine $exists and $where together :
db.domain.find( {tag : {$exists:true}, $where:'this.tag.length>3'} )
{
"_id" : 1001,
"domainName" : "google.com"
"tag" : [
"search engine",
"search",
"find anything",
"giant"
]
}