03-MongoDB文档查询操作

基本的文档查询操作



本节提供了在 mongosh 中使用 db.collection.find() 方法的查询操作示例。 示例使用清单(inventory )集合。 要填充清单集合,请运行以下命令:

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" }
]);

一、查询集合所有文档

要选择集合中的所有文档,请将一个空文档作为查询过滤器参数传递给 find 方法,或者不传递任何参数。

db.inventory.find( {
    
    } ) //或者直接使用 db.inventory.find()

该操作对应如下 SQL 语句:

SELECT * FROM inventory

二、相等条件查询

要指定相等条件,请在查询过滤器文档中使用 <field>:<value>表达式:

//为find()方法传入相等条件
{
    
     <field1>: <value1>, ... }

以下示例从清单集合中选择状态等于'D'的所有文档:

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

该操作对应如下 SQL 语句:

SELECT * FROM inventory WHERE status = "D"

三、使用查询运算符

查询过滤器可以使用查询运算符以下列形式指定条件:

{
    
     <field1>: {
    
     <operator1>: <value1> }, ... }

3.1 $in

in运算符选择字段值等于指定数组中的任何值的文档。
如果该字段包含一个数组,则 $in 运算符选择其数组字段至少一个与指定数组中元素的值匹配的文档 。
要指定 $in表达式,请使用以下原型:

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

以下示例从清单集合中检索状态等于'A''D'的所有文档:

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

该操作对应如下 SQL 语句:

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

3.2 $nin

$nin选择所有符合以下要求的文档,其中:

  • 字段值不在指定的数组中
  • 字段不存在

如果该字段(field)是一个数组,则 $nin运算符选择field数组中没有元素等于指定数组中元素的文档。

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

以下示例从清单集合中检索状态不等于'A''D'的所有文档:

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

3.3 $gt 大于

gt选择字段值大于(即>)指定值的那些文档。要指定 $gt表达式,请使用以下原型:

{
    
     field: {
    
     $gt: value } }

‎以下示例从清单集合中检索qty属性大于50的所有文档:

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

3.4 $gte 大于等于

gte选择字段值大于或等于(即 >=)指定值的文档,要指定$gte表达式,请使用以下原型:

{
    
     field: {
    
     $gte: value } }

以下示例从清单集合中检索qty属性大于等于50(包括50)的所有文档:

db.inventory.find( {
    
     qty: {
    
     $gte: 50 } } )

3.5 $lt 小于

lt选择字段值小于(即<)指定值的文档,要指定$lt表达式,请使用原型:

{
    
     field: {
    
     $lt: value } }

以下示例从清单集合中检索qty属性小于50的所有文档:

db.inventory.find( {
    
     qty: {
    
     $lt: 50 } } )

3.6 $lte 小于等于

lte选择字段值小于或等于(即<=)指定值的文档,要指定$lte表达式,请使用原型:

{
    
     field: {
    
     $lte: value } }

以下示例从清单集合中检索qty属性小于等于50(包括50)的所有文档:

db.inventory.find( {
    
     qty: {
    
     $lte: 50 } } )

有关 MongoDB 查询运算符的完整列表,请参阅‎‎查询和投影‎运算符‎文档。‎

四、AND 条件查询

复合查询可以为集合文档中的多个字段指定条件。逻辑AND可以隐式地连接复合查询的子句,以便查询选择集合中匹配所有条件的文档。
以下示例检索库存集合中状态为'A'且数量小于($lt)30的所有文档:

db.inventory.find( {
    
     status: "A", qty: {
    
     $lt: 30 } } )  //隐式AND,语句并没有AND运算符

该操作对应于以下SQL语句:

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

实际上,AND运算也对应一种运算符$and,我们可以使用如下写法显式的指明多个查询条件:

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

以上两种写法的作用完全相同,不过我们通常使用隐式的AND查询方式,以便得到更加简洁、可读的代码。

五、OR 条件查询

使用$or运算符,可以指定一个复合查询,该查询使用逻辑OR连接每个子句,以便查询选择集合中至少匹配一个条件的文档。
以下示例检索集合中状态等于A或数量小于($lt)30的所有文档:

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

该操作对应于以下SQL语句:

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

六、AND/OR联合查询

在以下示例中,复合查询文档选择集合中状态为'A'数量小于($lt)30项目以字符'p'开头的所有文档:

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

该操作对应于以下SQL语句:

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

猜你喜欢

转载自blog.csdn.net/weixin_43302112/article/details/126305726