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

标签 mongodb mongodb-query

我有一个 MongoDB 集合,其中包含以下格式的文档:

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

我目前可以获得匹配特定数组大小的文档:

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

这会正确返回 name 数组中包含 2 个元素的文档。但是,我无法执行 $gt 命令来返回所有 name 字段的数组大小大于 2 的文档:

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

如何选择所有具有大于 1 的 name 数组的文档(最好无需修改当前数据结构)?

最佳答案

在 MongoDB 2.2+ 中有一种更有效的方法来执行此操作,现在您可以在查询对象键中使用数字数组索引(基于 0)。

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

您可以使用使用部分过滤器表达式的索引支持此查询(需要 3.2+):

// index for at least two name array elements
db.accommodations.createIndex(
    {'name.1': 1},
    {partialFilterExpression: {'name.1': {$exists: true}}}
);

关于mongodb - 查询数组大小大于 1 的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53666799/

相关文章:

node.js - MongoDB 性能问题,可能是由于使用 native MongoDB 驱动程序在 NodeJS 项目中忽略了投影

mongodb - 如何汇总和平均两个日期之间的时间?

java - 如何在windows中使用cmd启动程序

mongodb - bson.ObjectId 的零值/零值是多少

node.js - Mongodbcursor.toArray() 已成为瓶颈

node.js - 试图从 mongoose 获取收藏列表

perl - 如何在 Perl 脚本中断开与 MongoDB 的连接?

mongodb - 子文档的 Mongo 更新

javascript - MongoDB - 相当于 LEFT JOIN,其中一个集合不存在

mongodb - monogdb "errmsg"中的错误:“WiredTigerIndex::insert:键太大无法索引,失败