Mongodb查询

 一、基础查询

1.插入基础数据

db.inventory.insertMany([
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);

2.查全部数据

db.inventory.find( {} )

等同于
SELECT * FROM inventory

3.单个条件搜索

db.inventory.find( { status: "D" } )

等价于
SELECT * FROM inventory WHERE status = "D"

4.单个字段使用in

db.inventory.find( { status: { $in: [ "A", "D" ] } } )

等价于
SELECT * FROM inventory WHERE status in ("A", "D")

5.多个条件and

db.inventory.find( { status: "A", qty: { $lt: 30 } } )

等价于
SELECT * FROM inventory WHERE status = "A" AND qty < 30

6.多个条件or

db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )

等价于
SELECT * FROM inventory WHERE status = "A" OR qty < 30

7.多个条件and和or混用

db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )

等价于
SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")

 

二、内嵌查询

1.插入基础数据

db.inventory.insertMany( [
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);

2.查询内嵌文档多个字段(需要按定义的顺序,否则查不出来)

db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )

结果

 

3.查询部分字段

db.inventory.find( { "size.uom": "in" } )

结果

4.查范围

db.inventory.find( { "size.h": { $lt: 15 } } )

结果

5.多条件混合

db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )

结果

 

三、数组查询

基础数据

db.inventory.insertMany([
   { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
   { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
   { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
   { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
   { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
]);

 

1.数组多个字查询

db.inventory.find( { tags: ["red", "blank"] } )

严格符合才会出现

结果

 

2.同时包含2个元素,但也可以包含其他元素

db.inventory.find( { tags: { $all: ["red", "blank"] } } )

结果

 

3.包含一个条件

db.inventory.find( { tags: "red" } )

只要存在red元素的都符合要求,结果

 

 4.范围条件

包含至少一个值大于25的元素的所有文档

db.inventory.find( { dim_cm: { $gt: 25 } } )

结果

 

一个元素可以满足大于15的条件,另一个元素可以满足小于20的条件,或者单个元素可以同时满足这两个条件

db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )

结果

 

 至少有一个元素是>22并且<30的

db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )

结果

 

第2个元素大于25(下标从0开始)

db.inventory.find( { "dim_cm.1": { $gt: 25 } } )

结果

 

 

5.指定数组数量

db.inventory.find( { "tags": { $size: 3 } } )

结果

 

 

四、数组内嵌对象查询

基础数据

db.inventory.insertMany( [
   { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
   { item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
   { item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
   { item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);

1.查询数组的一个元素

精确查询instock数组的一个元素值,warehouse=A,qty=5,并且严格按照此顺序

db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )

结果

整个嵌入/嵌套文档上的相等匹配要求与指定文档(包括字段顺序)完全匹配。例如,以下查询与库存集合中的任何文档都不匹配:

db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )

2.指定一个元素值范围

查询instock数组的qty元素,符合<=20的记录
db.inventory.find( { 'instock.qty': { $lte: 20 } } )

结果

3.指定数组第1个元素的属性查询

instock数组第一个元素的qty<=20的查询

db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )

结果

 4.某一个元素符合的查询

instock数组中至少有一个嵌入文档同时包含字段qty等于5和字段warehouse等于A的文档

db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )

结果

 

 instock数组中至少有一个嵌入文档包含大于10且小于或等于20的字段qty的文档

db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )

结果

5.使用数组元素的指定属性

 如果instock数组中嵌套的任何文档的qty字段大于10,并且数组中的任何文档(但不一定是同一嵌入文档)的qty字段小于或等于20,则以下查询将匹配这些文档

db.inventory.find( { "instock.qty": { $gt: 10,  $lte: 20 } } )

结果

 

查询instock数组中至少有一个包含字段qty等于5的嵌入文档和至少一个包含字段warehouse等于A的嵌入文档(但不一定是同一个嵌入文档)的文档

db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )

结果

 

五.从查询返回指定字段

基础数据

db.inventory.insertMany( [
  { item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
  { item: "notebook", status: "A",  size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
  { item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
  { item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
  { item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);

1.返回指定字段

db.inventory.find( { status: "A" } )
等价于
SELECT * from inventory WHERE status = "A"

查询指定字段

db.inventory.find( { status: "A" }, { item: 1, status: 1 } )
等价于
SELECT _id, item, status from inventory WHERE status = "A"

结果

不显示Id

db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )
等价于
SELECT item, status from inventory WHERE status = "A"

结果

 

 

 2返回全部字段,除了剔除的字段

db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )

结果

3.返回内嵌文档指定字段

返回item、status、size字段的uom属性(其他属性不显示)

db.inventory.find(
   { status: "A" },
   { item: 1, status: 1, "size.uom": 1 }
)

结果

 

屏蔽内嵌文档的指定属性

db.inventory.find(
   { status: "A" },
   { "size.uom": 0 }
)

结果

 

 4.返回数组的指定属性

显示item、status、instock数组的qty属性

db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )

结果

 

对于包含数组的字段,MongoDB提供了以下用于操作数组的投影运算符:$elemMatch、$slice和$。

以下示例使用$slice projection运算符返回instock数组中的最后一个元素:

$slice: -1 显示instock数组的最后一个元素
$slice: 0  显示instock数组的第一个元素
db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: -1 } } )

结果

 

db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: 1 } } )

结果

 

六.查询null值和不存在字段

基础数据

db.inventory.insertMany([
   { _id: 1, item: null },
   { _id: 2 }
])

 

1.查询null值

db.inventory.find( { item: null } )

结果

 

2.类型检查

 {item:{$type:10}}查询只匹配包含值为空的item字段的文档;即item字段的值为BSON type null(类型号10):

db.inventory.find( { item : { $type: 10 } } )

结果

 

3.字段存在性检查

以下示例查询不包含字段的文档。

item $exists: false }查询匹配不包含项目字段的文档

db.inventory.find( { item : { $exists: false } } )

结果

 

七.在mongodb shell里面使用循环游标

1.循环游标

var myCursor = db.users.find( { type: 2 } );

myCursor

 

var myCursor = db.users.find( { type: 2 } );

while (myCursor.hasNext()) {
   print(tojson(myCursor.next()));
}

 printjson() 替换 print(tojson())

var myCursor = db.users.find( { type: 2 } );

while (myCursor.hasNext()) {
   printjson(myCursor.next());
}

 

var myCursor =  db.users.find( { type: 2 } );

myCursor.forEach(printjson);

 

2.迭代器index

var myCursor = db.inventory.find( { type: 2 } );
var documentArray = myCursor.toArray();
var myDocument = documentArray[3];

 

var myCursor = db.users.find( { type: 2 } );
var myDocument = myCursor[1];

myCursor[1]等同于
myCursor.toArray() [1];

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-12-03 17:19  门罗的魔术师  阅读(241)  评论(0编辑  收藏  举报