当前位置: 首页 > 知识库问答 >
问题:

MongoDB中的精确匹配文档

严嘉良
2023-03-14

我目前正在Java应用程序上使用MongoDB的驱动程序。假设我将以下两个文档存储在一个集合中:

文件A:

{
  "_id": "something",
  "key1": "Value1",
  "Key2": "Value2",
  "Key3": "Value3"
}

文件B:

{
  "_id": "somethingDifferent",
  "key1": "Value1",
  "Key2": "Value2"
}

现在,我想通过使用key1和key2的值从集合中检索DocumentB的精确匹配,而不返回documenta,而不是_id,因为我事先不知道它。

如果我只是使用DocumentB作为查询(没有_id),Mongo也将返回DocumentA,因为它匹配所有的键和值,不考虑DocumentA有一个额外的键(key3)。

有没有办法在Mongo中执行这个“精确匹配”查询?之后我必须进行检查吗?

共有2个答案

柯星辰
2023-03-14

如果匹配的查询key: value对的顺序与存储文档的顺序相同,则下面的聚合可以使用$eq运算符。

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $eq: [
          {
            "key1": "Value1",
            "Key2": "Value2"
          },
          {
            $arrayToObject: {
              $filter: {
                input: {
                  $objectToArray: "$$ROOT"
                },
                cond: {
                  $ne: [
                    "$$this.k",
                    "_id"
                  ]
                }
              }
            }
          }
        ]
      }
    }
  }
])

蒙古游乐场

警告:这些对象是相等的

{                          {
  "key1": "Value1"   ----      "key1": "Value1",
  "Key2": "Value2",  ----      "Key2": "Value2"
}                          }

这些对象并不相等

{                          {
  "key1": "Value1"   --/-      "Key2": "Value2",
  "Key2": "Value2",  -/--      "key1": "Value1"
}                          }
鲜于允晨
2023-03-14

假设“完全匹配”是指文档除了查询中的字段之外没有其他字段。

您需要使用聚合框架来检索对象中的键列表,并筛选出具有意外键的键。在mongodb语法中,可以如下所示:

db.collection.aggregate([
  {
    $match: {
        "key1": "Value1",
        "Key2": "Value2"
    }
  },
  {
    $addFields: {
      extra_keys: {
        $setDifference: [
          {
            $map: {
              input: {
                $objectToArray: "$$ROOT"
              },
              in: "$$this.k"
            }
          },
          [                   // <== the list of keys in the query
            "_id",
            "key1",
            "Key2"
          ]
        ]
      }
    }
  },
  {
    $match: {
      extra_keys: []
    }
  }
])
 类似资料:
  • 本文向大家介绍MongoDB精确数组匹配,包括了MongoDB精确数组匹配的使用技巧和注意事项,需要的朋友参考一下 对于精确的数组匹配,只需在MongoDB中使用。让我们创建一个包含文档的集合- 在方法的帮助下显示集合中的所有文档- 这将产生以下输出- 这是对MongoDB数组匹配的查询- 这将产生以下输出-

  • 我正在使用elasticsearch从json字段进行精确短语匹配。我尝试过多种语法,比如multi_match、query_string query_string我正在使用的语法; 我也尝试了过滤器而不是查询,但是过滤器在json上没有给出任何结果。我用于过滤器的语法是; 现在的问题是; 是否可以使用elasticsearch对json执行精确匹配操作?

  • 问题内容: 我正在尝试编写一个NEST查询,该查询应基于完全匹​​配的字符串返回结果。我已经在网络上进行了研究,并且对使用术语,匹配,匹配短语有一些建议。我已经尝试了所有这些方法,但是搜索返回的结果中包含搜索字符串的一部分。例如,在我的数据库中,我有以下几行电子邮件地址: ter@gmail.com ter@hotmail.com terrance@hotmail.com 无论我是否使用: 要么

  • 我正在尝试创建一个Lucene4.10索引。我只想在索引中保存我放入文档的确切字符串,witout标记化。 我在用StandardAnalyzer。 我试图搜索术语“燃料箱容量”@en(包括引号),所以我试图省略它们,并在术语周围添加了另外几个引号,以便让lucene理解我正在搜索整个文本。 如果我打印查询,我会得到:3:“燃料箱容量en”,但我不想拆分@符号上的文本。 我认为我的第一个问题是St

  • 我试图检查字符串是否包含完全匹配。例如: String str="这是我的字符串,具有-Policy和-p" 我怎样才能做到以下几点:

  • 我希望与字段中的字符串完全匹配,然后返回一天,提取所有此类记录。我所使用的json似乎也与简单的单词相匹配。我不确定我哪里出了问题。我需要向这个查询JSON添加吗?我目前拥有的JSON如下所示: