Mongodb 在$or和$and场景中使用$elemMatch的阵列
为简单起见,假设存在以下数据Mongodb 在$or和$and场景中使用$elemMatch的阵列,mongodb,mongodb-query,Mongodb,Mongodb Query,为简单起见,假设存在以下数据 [ { "special_colors": ["Blue", "Black", "Red"], }, { "special_colors": ["Blue", "Green", "Red"], }, { "spe
[
{
"special_colors": ["Blue", "Black", "Red"],
},
{
"special_colors": ["Blue", "Green", "Red"],
},
{
"special_colors": ["Black", "Blue", "Red"],
}
]
如果我执行:
db.fighters.find({"special_colors.2": "Red"}, {"_id": 0}).pretty()
db.fighters.find({"special_colors.0": "Blue"}, {"_id": 0}).pretty()
db.fighters.find({"special_colors.1" : "Blue"}, {"_id" : 0}).pretty()
它工作并返回所有文档
如果我执行:
db.fighters.find({"special_colors.2": "Red"}, {"_id": 0}).pretty()
db.fighters.find({"special_colors.0": "Blue"}, {"_id": 0}).pretty()
db.fighters.find({"special_colors.1" : "Blue"}, {"_id" : 0}).pretty()
它工作并返回第一个和第二个文档
如果我执行:
db.fighters.find({"special_colors.2": "Red"}, {"_id": 0}).pretty()
db.fighters.find({"special_colors.0": "Blue"}, {"_id": 0}).pretty()
db.fighters.find({"special_colors.1" : "Blue"}, {"_id" : 0}).pretty()
它工作并返回第三个文档
为了检索所有文档,而不考虑(索引)位于蓝色或黑色的哪个位置,我执行了以下操作,效果良好:
db.fighters.find({"special_colors" : {$elemMatch: {$eq: "Blue"} } }, {"_id" : 0}).pretty()
情况/场景
我想应用一个或,它检索所有特殊颜色
为蓝色
或黑色
(不考虑索引位置)的文档,我尝试了许多变化,例如:
db.fighters.find({"special_colors" : {$elemMatch: {$eq: "Blue", $eq: "Black"} } }, {"_id" : 0}).pretty()
当执行时,返回一些文档,但只考虑第二部分(黑色)和第一部分(蓝色)被完全忽略
与
执行时不返回任何内容
与
执行时会出现以下错误消息:$或/$和/$或条目必须是完整对象
以及:
db.fighters.find({
"special_colors": {
$or: [{$elemMatch: {$eq: "Blue"}},
{$elemMatch: {$eq: "Black"}}
]
}
}, {"_id": 0}).pretty()
执行时出现以下错误消息:unknown operator:$or
那么或
和和
的正确语法是什么呢
因此:
- 检索
为特殊颜色
或蓝色
的所有文档(不考虑索引位置)黑色
- 检索
特殊颜色既有
又有蓝色
的所有文档(不考虑索引位置)黑色
$elemMatch
实现这一点,它更适合用于数组中的嵌套文档。因为Mongo将所有数组展平用于查询,所以您可以只用于“或”条件和“和”条件,如下所示:
db.collection.find({
special_colors: {
$in: [
"Blue",
"Black"
]
}
})
将匹配任何具有蓝色或黑色的文档
以及:
将匹配在其数组中同时具有两种颜色的文档
理论上,您可以使用
$elemMatch
实现这一点,它更适合用于数组中的嵌套文档。因为Mongo将所有数组展平用于查询,所以您可以只用于“或”条件和“和”条件,如下所示:
db.collection.find({
special_colors: {
$in: [
"Blue",
"Black"
]
}
})
将匹配任何具有蓝色或黑色的文档
以及:
将匹配在其数组中同时具有两种颜色的文档
检索特殊颜色
为蓝色
或黑色
的所有文档(不考虑索引位置)
:
- 选择字段值等于指定数组中任何值的文档
$或
:(等同于中的$)
- 不需要对字符串数组使用
$elemMatch
检索特殊颜色既有蓝色
又有黑色
的所有文档(不考虑索引位置)
:
- 相当于指定值的
$和操作
$and
:(等同于$all
)
检索特殊颜色
为蓝色
或黑色
的所有文档(不考虑索引位置)
:
- 选择字段值等于指定数组中任何值的文档
$或
:(等同于
中的$)
- 不需要对字符串数组使用
$elemMatch
检索特殊颜色既有蓝色
又有黑色
的所有文档(不考虑索引位置)
:
- 相当于指定值的
$和操作
$and
:(等同于$all
)
很明显,第一眼看到的$in
和$all
更好,因为只需强制一次使用该字段。第一眼看到的$in
和$all
更好,因为只需强制一次使用该字段