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

子单据多字段Mongo查询

云开诚
2023-03-14

假设我有一个这样的收藏:

{ "arr" : [ { "name" : "a", "num" : 1 }, { "name" : "a", "num" : 2 } ] },
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "a", "num" : 2 } ] },
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "b", "num" : 2 } ] }

我想找到所有arr包含一个子文档的文档,该子文档的名称=“b”和num=2。

如果我做这样的查询:

db.collection.find({
    $and: [
        { "arr.name": "b" },
        { "arr.num": 2 }
    ]
});

它将返回集合中的所有文档,因为每个文档都包含一个子文档,该子文档的名称为“b”,或者num为2。

我也试过:

db.collection.find({
    arr: [
        { "name": "b", "num": 2 }
    ]
});

它不会抛出任何错误,但不会返回任何结果。

如何在MongoDB中查询多个子文档字段?

共有1个答案

轩辕亮
2023-03-14

这实际上就是$elemMatch操作符的用途,尽管它经常被误用。它本质上对数组中的每个元素执行查询条件。除非另有明确调用,否则所有MongoDB参数都是“and”操作:

db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2  } } })

如果您只需要匹配的字段而不是整个文档,那么您可能也希望在此处“投影”:

db.collection.find(
    { "arr": { "$elemMatch": { "name": "b", "num": 2  } } },
    { "arr.$": 1 }
)

最后,要解释第二次尝试失败的原因,请执行以下查询:

db.collection.find({
    "arr": [
        { "name": "b", "num": 2 }
    ]
})

不匹配任何内容,因为没有实际的文档中“arr”包含与您的条件完全匹配的单数元素。

您的第一个示例失败..:

db.collection.find({
    $and: [
        { "arr.name": "b" },
        { "arr.num": 2 }
    ]
});

因为有几个满足条件的数组元素,这不仅仅是认为两个条件都适用于同一个元素。这就是$elemMatch添加的内容,当你需要更多的条件来匹配时,这就是你使用它的地方。

 类似资料:
  • 我正在玩Spring数据Mongo查询,并想知道字段属性参数。以下是我从文档中获得的示例: 问题是:在{“firstname”:1,“lastname”:1}中,1的含义是什么?

  • 查询下面的数据时,返回的游标为空。而满足该条件的文档有100个。 使用以下代码 MongoDB驱动程序“go.MongoDB.org/mongo-driver/mongo” 日志写入 日志读取 日志结构 MongoDB数据 状态仅为返回整份8K文档 collection.find()函数是否适合它。 Shell命令正在正确返回文档

  • 我是spring数据Mongo的新手,所以我肯定做错了什么,因为我无法执行这样一个简单的查询。这是我的模型: 我想从一个品牌获得所有的模型,所以我实现DAO如下: 如果我在shell中执行这个mongodb查询,它就会工作: 但是,Java应用程序抛出以下异常: 很明显,它在Brand类中查找一个字段$id,但由于它不存在,它失败了。因此,我将查询更改为以下内容,以便它导航到id字段: 现在,它没

  • 每个人。在mongo组查询中,结果仅显示参数中的键。如何像mysql查询组一样保留每个组中的第一个文档。例如: 结果: 如何获取以下内容:

  • 我配置了一个带有两个字段的Elasticsearch索引:“name”和“type”。当我执行下面的查询时,没有得到任何结果,因为“actor”在“type”字段中。 有没有任何方法可以执行一个包含多个单词的查询,并且即使一些单词在“name”字段中而其他单词在“type”字段中也可以得到结果。 谢谢你的帮助!

  • 我正在尝试使用spring查询mongodb。我们有一个集合,其中包含一棵树,并包含一个项目列表作为树路径(因此我们可以轻松遍历树)。我们有一个需要返回特定节点的所有子节点的查询。我们的查询基于选择路径中有节点(父节点)且比父节点(级别)低一级的所有节点。我们的标准如下: 唉,当我们在mongodb上调用它时,我们会得到以下异常: 组织。springframework。数据mongodb。Inva