美文网首页数据库
数组和范围查询的注意点

数组和范围查询的注意点

作者: Uzero | 来源:发表于2017-02-07 13:06 被阅读7次

先插入几条数据,如下:

db.man.insert([{"age":5},{"age":10},{"age":15},{"age":25},{"age":[12]},{"age":[12,13]},{"age":[18,21]},{"age":[5,25]}])

db.man.find()

{ "_id" : ObjectId("5899baa741d79c19ed14f7a4"), "age" : 5 }

{ "_id" : ObjectId("5899baa741d79c19ed14f7a5"), "age" : 10 }

{ "_id" : ObjectId("5899baa741d79c19ed14f7a6"), "age" : 15 }

{ "_id" : ObjectId("5899baa741d79c19ed14f7a7"), "age" : 25 }

{ "_id" : ObjectId("5899baa741d79c19ed14f7a8"), "age" : [ 12 ] }

{ "_id" : ObjectId("5899baa741d79c19ed14f7a9"), "age" : [ 12, 13 ] }

{ "_id" : ObjectId("5899baa741d79c19ed14f7aa"), "age" : [ 18, 21 ] }

{ "_id" : ObjectId("5899baa741d79c19ed14f7ab"), "age" : [ 5, 25 ] }

(1)查询 10 < x < 20 的记录

db.man.find({"age":{"$gt":10 , "$lt":20}})

{ "_id" : ObjectId("5899baa741d79c19ed14f7a6"), "age" : 15 }

{ "_id" : ObjectId("5899baa741d79c19ed14f7a8"), "age" : [ 12 ] }

{ "_id" : ObjectId("5899baa741d79c19ed14f7a9"), "age" : [ 12, 13 ] }

{ "_id" : ObjectId("5899baa741d79c19ed14f7aa"), "age" : [ 18, 21 ] }

{ "_id" : ObjectId("5899baa741d79c19ed14f7ab"), "age" : [ 5, 25 ] }

总结

文档中的标量(非数组元素)必须与查询条件中的每一条语句相匹配。例如,如果使用{“x”:{"$gt":10, "$lt":20}进行查询,只会匹配“X”键的值大于10并且小于20的文档。但是假如某个文档的x字段是一个数组,并且x的键的某一个元素与查询的任何一条语句相匹配【存在】,那么这个文档也会返回。

换一种写法

db.man.find({"age":{"$gt":10,"$lt":20}}).min({"age":10}).max({"age":20})

Error: error: {

           "waitedMS" : NumberLong(0),

           "ok" : 0,

           "errmsg" : "error processing query: ns=demo.manTree: $and\n    age $lt 20.0\n    age $gt 10.0\nSort: {}\nProj: {}\n planner returned error: unable to find relevant index for max/min query",

           "code" : 2

}

意思是需要建立索引

db.man.ensureIndex({"age":1})

{

          "createdCollectionAutomatically" : false,

          "numIndexesBefore" : 1,

          "numIndexesAfter" : 2,

          "ok" : 1

}

再次执行

db.man.find({"age":{"$gt":10,"$lt":20}}).min({"age":10}).max({"age":20})

{ "_id" : ObjectId("5899baa741d79c19ed14f7a8"), "age" : [ 12 ] }

{ "_id" : ObjectId("5899baa741d79c19ed14f7a9"), "age" : [ 12, 13 ] }

{ "_id" : ObjectId("5899baa741d79c19ed14f7a6"), "age" : 15 }

{ "_id" : ObjectId("5899baa741d79c19ed14f7aa"), "age" : [ 18, 21 ] }

db.man.find({"age":{"$elemMatch":{"$gt":10,"$lt":20}}})

{ "_id" : ObjectId("5899baa741d79c19ed14f7a8"), "age" : [ 12 ] }

{ "_id" : ObjectId("5899baa741d79c19ed14f7a9"), "age" : [ 12, 13 ] }

{ "_id" : ObjectId("5899baa741d79c19ed14f7aa"), "age" : [ 18, 21 ] }

总结

1. 可以使用 “$elemMatch” 要求 Mongodb 同时使用查询条件中的两个语句 与 一个数组元素进行比较,并且该标签不会匹配非数组元素

2. 使用min和max时候一定要该字段添加索引,要不添加就会报错。

疑问:如果我只想查age为非数组的记录?

相关文章

  • 数组和范围查询的注意点

    先插入几条数据,如下: db.man.insert([{"age":5},{"age":10},{"age":15...

  • MySQL索引数据结构

    哈希表、有序数组和搜索树。哈希表这种结构适用于只有等值查询的场景有序数组在等值查询和范围查询场景中的性能就都非常优...

  • mysql索引笔记

    常见索引的类型 hash索引适用于等值查询的场景 有序数组适用于等值查询和范围查询 搜索数 InnoDB B+树索...

  • 10 C数组的使用

    1、why数组? 2、数组初始化 3、数组遍历 4、存储细节 5、使用中的注意点 5.1、基本注意点 5.2、和函...

  • 公众号内网页

    循环的时候注意不要置空数组get getall查询一条,查询多条sql查询生成器 前端样式 数据调用

  • 数组注意点

    数组在内存中的存储 变量的内存寻址是从大到小,所以存储数据时会从高字节开始存储 数组存储的和变量相反,元素存储是从...

  • TP5 scope 范围查询 以及 useGlobalScop

    设置查询范围 使用查询范围 闭包使用 全局查询范围的定义 如果你的所有查询都需要一个基础的查询范围,那么可以在模型...

  • 刷leetCode算法题+解析(四十六)

    查询后的偶数和 题目:给出一个整数数组 A 和一个查询数组 queries。对于第 i 次查询,有 val = q...

  • Mysql索引总结

    索引的常见模型 1.哈希表 查询效率高,比较适合等值查询,但不适合范围查询 2.有序数组,只有一层,减少I/O...

  • Oracle查询第几条数据

    如下查询第9条数据,注意大的范围在前,小的范围在后 (select a.OBJECT_NAME Name from...

网友评论

    本文标题:数组和范围查询的注意点

    本文链接:https://www.haomeiwen.com/subject/avvpittx.html