为了账号安全,请及时绑定邮箱和手机立即绑定

查询数组大小大于1的文档

查询数组大小大于1的文档

撒科打诨 2019-06-19 17:00:50
查询数组大小大于1的文档我有一个MongoDB集合,其文档格式如下:{   "_id" : ObjectId("4e8ae86d08101908e1000001"),   "name" : ["Name"],   "zipcode" : ["2223"]}{   "_id" : ObjectId("4e8ae86d08101908e1000002"),   "name" : ["Another ", "Name"],   "zipcode" : ["2224"]}我目前可以获得与特定数组大小匹配的文档:db.accommodations.find({ name : { $size : 2 }})将正确地返回带有两个元素的文档。name阵列。但是,我不能$gt命令返回name字段的数组大小大于2:db.accommodations.find({ name : { $size: { $gt : 1 } }})如何使用name大小大于一个的数组(最好不必修改当前的数据结构)?
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

在MongoDB2.2+中,有一种更有效的方法可以在查询对象键中使用数字数组索引。

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

您可以使用部分筛选表达式(要求3.2+)的索引来支持此查询:

db.accommodations.createIndex(
    {'name.1': 1},
    {partialFilterExpression: {'name.1': {$exists: true}}});


查看完整回答
反对 回复 2019-06-19
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

我相信这是回答你问题的最快的查询,因为它不使用解释$where条款:

{$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" ] }

>


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 813 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信