$and
MongoDB5.0 已于 10 月2024 结束生命周期。不再支持此版本的文档。要升级5.0 部署,请参阅 MongoDB6 。0 升级程序。
$and
$and
对由一个或多个表达式(<expression1>
、<expression2>
等)组成的数组执行逻辑AND
操作,并选择满足所有表达式的文档。注意
指定用逗号分隔的表达式列表时,MongoDB 提供隐式
AND
操作。
兼容性
可以使用 $and
查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
$and
采用以下语法:
{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
行为
要允许查询引擎优化查询,$and
会按如下方式处理错误:
如果提供给
$and
的任何表达式在单独求值时会导致错误,则包含该表达式的$and
可能但不一定会导致错误。在提供给
$and
的第一个表达式之后提供的表达式可能会导致错误,即使第一个表达式的计算结果为false
。
例如,如果 $x
为 0
,以下查询会始终产生错误:
db.example.find( { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } )
以下查询包含提供给 $and
的多个表达式,如果存在 $x
为 0
的任何文档,则查询可能会产生错误:
db.example.find( { $and: [ { x: { $ne: 0 } }, { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } ] } )
示例
AND
使用指定同一字段的多个表达式的查询
请考虑以下查询:
db.inventory.find( { $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } } ] } )
该查询选择 inventory
集合中满足如下条件的所有文档:
price
字段值不等于1.99
并且price
字段存在。
可使用隐式 AND
操作重写该查询,而该操作组合 price
字段的操作符表达式:
db.inventory.find( { price: { $ne: 1.99, $exists: true } } )
AND
使用指定同一运算符的多个表达式的查询
请考虑以下查询:
db.inventory.find( { $and: [ { $or: [ { qty: { $lt : 10 } }, { qty : { $gt: 50 } } ] }, { $or: [ { sale: true }, { price : { $lt : 5 } } ] } ] } )
该查询选择所有文档,其中:
qty
字段值小于10
或大于50
,并且sale
字段值等于true
或price
字段值小于5
。
该查询不能使用隐式 AND
操作,因为它多次使用 $or
操作符。