介绍mongodb数据查询运算符

作者:杨润炜
日期:2016/3/14 16:35

今天来介绍下mongodb数据查询的几个运算符,它们都相对好理解。

$eq

简述:匹配字段某值或者匹配数组字段内某子项的值来查询
记忆: equal
用法:

  1. { <field>: { $eq: <value> } }

示例:
inventory表的原始数据

  1. { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }
  2. { _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] }
  3. { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }
  4. { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }
  5. { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }
1.匹配值

具体代码

  1. db.inventory.find( { qty: { $eq: 20 } } )

等价于

  1. db.inventory.find( { qty: 20 } )

结果

  1. { _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] }
  2. { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }
2.匹配数组字段子项的值

具体代码

  1. db.inventory.find( { tags: { $eq: "B" } } )

结果

  1. { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }
  2. { _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] }
  3. { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }
  4. { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }

小结:$eq匹配值等价于直接匹配值,其主要使用点还是在于匹配数组字段子项的值。

$gt, $gte, $lt, $lte

这四个运算符的用法很相似,只要知道一个,其它都可以依此类推,只要知道:
$gt表示匹配字段某值大于指定值;
$gte表示匹配字段某值大于等于指定值;
$lt表示匹配字段某值小于指定值;
$lte表示匹配字段某值小于等于指定值;

下面用$gt来进行详细说明。
简述:匹配字段某值大于指定值
用法:

  1. {field: {$gt: value} }

示例:
inventory表的原始数据
同$eq的inventory数据。

具体代码

  1. db.inventory.find( { qty: { $gt: 20 } } )

结果

  1. { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }
  2. { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }

注:在这几个运算符中,可对js的date类型值进行直接比较。

$ne

简述:匹配字段某值不为指定值
记忆: not equal
用法:

  1. {field: {$ne: value} }

示例:
inventory表的原始数据

  1. { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }
  2. { _id: 2, item: { name: "cd" }, qty: 20, tags: [ "B" ] }
  3. { _id: 3, item: { name: "ij" }, qty: 25, tags: [ "A", "B" ] }
  4. { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }
  5. { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }
1. 不等于具体值

具体代码

  1. db.inventory.find( { qty: { $ne: 20 } } )

结果

  1. { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }
  2. { _id: 3, item: { name: "ij" }, qty: 25, tags: [ "A", "B" ] }
  3. { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }

2.没有某字段

具体代码

  1. db.inventory.find( { "item.code": { $ne: null } } )

结果

  1. { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }
  2. { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }
  3. { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }

$in, $nin

简述:与$eq,$ne相似,区别在于指定值是数组,即一些数值,可以为把要比较的字段数值与1个以上的数据进行比较。
下面用$in来举例
用法:

  1. { field: { $in: [<value1>, <value2>, ... <valueN> ] } }

示例:
inventory表的原始数据

  1. { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "ab", "abc", "123" ] }
  2. { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "abc" ] }
  3. { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }
1. 1个以上常规值匹配

具体代码

  1. db.inventory.find( { tags: { $in: ['abc', '123'] } } )

结果

  1. { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "ab", "abc", "123" ] }
  2. { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "abc" ] }

2.正规表达式匹配

具体代码

  1. db.inventory.find( { tags: { $in: [/^ab/, /^12/] } } )

结果

  1. { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "ab", "abc", "123" ] }
  2. { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "abc" ] }

感谢您的阅读!
如果看完后有任何疑问,欢迎拍砖。
欢迎转载,转载请注明出处:http://www.yangrunwei.com/a/42.html
邮箱:glowrypauky@gmail.com
QQ: 892413924

上一篇:开启HTTP/2
下一篇:linux命令转义