mongodb查询不等于某个字段_3.1 MongoDB 读取操作

读操作从集合中检索文档; 即为文档查询集合。 MongoDB提供了以下方法来从集合中读取文档:

  • db.collection.find()

要选择集合中的所有文档,请将空文档作为查询过滤器参数传递给find方法。 查询过滤器参数确定选择标准:

db.inventory.find( {} )

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

SELECT * FROM inventory

指定等价条件

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

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

以下示例从inventory集合中选择status等于“D”的所有文档:

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

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

SELECT * FROM inventory WHERE status = "D"

使用查询操作指定条件

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

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

以下示例从inventory集合中检索status等于“A”或“D”的所有文档:

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

注意:

虽然您可以使用$or 运算符表达此查询,但在对同一字段执行相等性检查时,请使用$ in运算符而不是$or运算符。

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

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

有关MongoDB查询运算符的完整列表,请参阅 Query and Projection Operators 文档。

指定 AND 条件

复合查询可以为集合的文档中的多个字段指定条件。 隐式地,逻辑AND连接连接复合查询的子句,以便查询选择集合中与所有条件匹配的文档。

以下示例检索inventory集合中状态等于“A”且qty小于($ lt)30的所有文档:

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

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

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

指定 OR 条件

使用$或运算符,可以指定将每个子句与逻辑OR连接相连接的复合查询,以便查询选择集合中至少与一个条件匹配的文档。

以下示例检索集合中状态等于“A”或qty小于($ lt)30的所有文档:

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

这个操作相关的sql 语句如下:

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

指定AND以及OR条件

在以下示例中,复合查询文档选择集合中状态等于“A”且qty小于($ 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%")

MongoDB支持正则表达式$ regex查询来执行字符串模式匹配。

查询嵌套的 文档

填充测试的集合请运行以下命令:

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" }

]);

匹配 嵌套文档

要在作为嵌套文档的字段上指定相等条件,请使用查询过滤文档{<field>:<value>},其中<value>是要匹配的文档。

例如,以下查询选择字段size 等于{h:14,w:21,uom:“cm”}的所有文档:

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

整个嵌套文档的等式匹配是指定的<value>文档的完全匹配,包括字段顺序。 例如,以下查询与inventory集合中的任何文档都不匹配:

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

在嵌套列上的查询

要在嵌套文档中的字段上指定查询条件,请使用点表示法(“field.nestedField”)。

注意:

使用点表示法查询时,字段和嵌套字段必须在引号内。

在嵌套列上指定 相等的匹配

以下示例选择size字段中嵌套的字段uom 等于“in”的所有文档:

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

使用查询操作指定匹配

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

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

以下查询在size字段中嵌入的字段h上使用小于运算符($ lt):

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

指定 AND 条件

以下查询选择嵌套字段h小于15的所有文档,嵌套字段uom等于“in”,status字段等于“D”:

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 ] }

]);

匹配数组

要在数组上指定相等条件,请使用查询文档{<field>:<value>},其中<value>是要匹配的确切数组,包括元素的顺序。

以下示例查询所有文档,其中字段tags值是一个数组,其中包含指定顺序的两个元素“red”和“blank”:

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

相反,如果您希望找到包含元素“red”和“blank”的数组,而不考虑数组中的顺序或其他元素,请使用$ all运算符:

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

查询数组中的一个元素

要查询数组字段是否包含至少一个具有指定值的元素,请使用过滤器{<field>:<value>},其中<value>是元素值。

以下示例查询所有文档,其中tags是一个包含字符串“red”作为其元素之一的数组:

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

要在数组字段中指定元素的条件,请在查询过滤器文档中使用查询运算符:

{ <array field>: { <operator1>: <value1>, ... } }

例如,以下操作查询数组dim_cm包含至少一个值大于25的元素的所有文档。

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

为数组元素指定多个条件

在数组元素上指定复合条件时,可以指定查询,使得单个数组元素满足这些条件,或者数组元素的任何组合都满足条件。

在数组元素上查询具有复合过滤条件的数组

以下示例查询dim_cm数组包含某些组合满足查询条件的元素的文档; 例如,一个元素可以满足大于15的条件,另一个元素可以满足小于20的条件,或者单个元素可以满足两个条件:

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

查询符合多个条件的数组元素

使用$elemMatch运算符指定数组元素的多个条件,以便至少有一个数组元素满足所有指定的条件。

以下示例查询dim_cm数组包含至少一个大于($gt) 22且小于($lt) 30的元素的文档:

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

通过数据索引位置查询元素

使用点表示法,您可以为数组的特定索引或位置处的元素指定查询条件。 该数组使用从零开始的索引。

注意:

使用点表示法查询时,字段和嵌套字段必须在引号内。

以下示例查询数组dim_cm中第二个元素大于25的所有文档:

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

通过数组长度查询一个数组

使用$size运算符按元素数查询数组。 例如,以下选择数组标记具有3个元素的文档。

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

查询数组中被嵌套的文档

例如下面的 inventory 集合:

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 } ] }

]);

以下示例选择instock数组中的元素与指定文档匹配的所有文档:

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

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

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

在文档数组中的字段上指定查询条件

以下示例选择instock数组至少包含一个嵌入文档的所有文档,该文档包含字段qty其值小于或等于20的:

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

使用数组索引查询嵌入文档中的字段

使用点表示法,您可以在文档的特定索引或位置指定字段的查询条件。 该数组使用从零开始的索引。

注意:

使用点表示法查询时,字段和索引必须在引号内。

以下示例选择instock数组作为其第一个元素的所有文档,该文档包含其值小于或等于20的字段qty:

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

为文档数组指定多个条件

在嵌套在文档数组中的多个字段上指定条件时,可以指定查询,以使单个文档满足这些条件,或者数组中的任何文档组合(包括单个文档)满足条件。

单个嵌套文档在嵌套字段上遇到多个查询条件

以下示例查询instock数组至少有一个嵌入文档的文档,该文档包含字段qty等于5且字段warehouse等于A:

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

以下示例查询instock数组至少有一个包含字段数量大于10且小于或等于20的嵌入文档的文档:

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

元素组合满足标准

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

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

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

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

从查询中返回项目字段

默认情况下,MongoDB中的查询返回匹配文档中的所有字段。 要限制MongoDB发送到应用程序的数据量,您可以包含 projection文档以指定或限制要返回的字段。

使用下面语句填充 inventory 集合:

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 } ] }

]);

返回匹配文档的所有字段

如果未指定投影文档,则db.collection.find()方法将返回匹配文档中的所有字段。

以下示例返回清单集合中状态等于“A”的所有文档中的所有字段:

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

这个操作被下列sql 语句相关联:

SELECT * from inventory WHERE status = "A"

返回指定字段和仅_id字段

通过在文档中将<field>设置为1,可以明确地包括多个字段。 以下操作返回与查询匹配的所有文档。 在结果集中,只有item,status和默认情况下的_id字段在匹配的文档中返回。

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

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

SELECT _id, item, status from inventory WHERE status = "A"

压制 _id 列

您可以通过在投影中将其设置为0来从结果中删除_id字段,如下例所示:

db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )

操作相关到下列sql 语句:

SELECT item, status from inventory WHERE status = "A"

注意:

除_id字段外,您无法在文档中组合联合包含和排除语句。

返回所有排除之外的字段

您可以使用投影排除特定字段,而不是列出要在匹配文档中返回的字段。 以下示例返回匹配文档中status和instock字段以外的所有字段:

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

注意:

除_id字段外,您无法在投影文档中组合包含和排除语句。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值