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
更好,因为只需强制一次使用该字段