others - 在MongoDB,如何找到文档数组大小大于1?

我有一个MongoDB集合,其文件格式如下:


{
"_id" : ObjectId("4e8ae86d08101908e1000001"),
"name" : ["Name"],
"zipcode" : ["2223"]
}
{
"_id" : ObjectId("4e8ae86d08101908e1000002"),
"name" : ["Another","Name"],
"zipcode" : ["2224"]
}
{
"_id" : ObjectId("4e8ae86d08101908e1000003"),
"name" : ["Yet"," Another","Name"],
"zipcode" : ["2225"]
}

我的问题是:如何选择名称数组大小大于1的所有文档?

我可以获得与数组大小匹配的文档:


db.accommodations.find({"name":{$size:2 }})


db.accommodations.find({"name":{$size: {$gt:1} }})

时间:

对于mongodb版本2.2 ,有更高效的方法。


1.使用$where


db.accommodations.find( { $where:"this.name.length > 1" } );

但是。

Javascript执行比本页面列出的本地操作符慢得多,但是它非常灵活,查看服务器端处理页面以获得更多信息。

2.创建附加字段NamesArrayLength,用数组长度更新它,然后在查询中使用:


db.accommodations.find({"NamesArrayLength": {$gt: 1} });

这是一个更好的解决方案,并且更快(你可以创建索引)。

现在,你可以在查询对象键中使用数字数组索引,因此在MongoDB 22及更高版本中有一种更有效的方法。


// Find all docs that have at least a second name array element.
db.accommodations.find({'name.1': {$exists: true}})


{$nor: [
 {name: {$exists: false}},
 {name: {$size: 0}},
 {name: {$size: 1}}
]}

测试:


> db.test.save({})
> db.test.save({name: []})
> db.test.save({name: ['George']})
> db.test.save({name: ['George', 'Raymond']})
> db.test.save({name: ['George', 'Raymond', 'Richard']})
> db.test.save({name: ['George', 'Raymond', 'Richard', 'Martin']})
> db.test.find({$nor: [{name: {$exists: false}}, {name: {$size: 0}}, {name: {$size: 1}}]})
{"_id" : ObjectId("511907e3fb13145a3d2e225b"),"name" : ["George","Raymond" ] }
{"_id" : ObjectId("511907e3fb13145a3d2e225c"),"name" : ["George","Raymond","Richard" ] }
{"_id" : ObjectId("511907e3fb13145a3d2e225d"),"name" : ["George","Raymond","Richard","Martin" ] }
>

...