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

MongoDB嵌套数组查询

容磊
2023-03-14

我问了这个问题作为对另一个问题的评论,也在mongodb-user上发布了一个问题。到目前为止没有回复,所以我求助于问一个单独的问题。

文件说明:

如果字段包含一个数组,则$in操作符选择其字段包含数组的文档,该数组至少包含一个与指定数组中的值匹配的元素(例如,等等)

我正在使用:

mongod --version:
db version v2.2.2, pdfile version 4.5
Thu May 30 12:19:12 git version: d1b43b61a5308c4ad0679d34b262c5af9d664267

mongo --version:
MongoDB shell version: 2.0.4

在MongoDB外壳中:

db.nested.insert({'level1': {'level2': [['item00', 'item01'], ['item10', 'item11']]}})

下面是应根据文档及其生成的结果工作的查询列表:

为什么这个不行?

> db.nested.findOne({'level1.level2.0': 'item00'})
null

为什么我需要所有的钱?

> db.nested.findOne({'level1.level2.0': {'$all': ['item00']}})
{
    "_id" : ObjectId("51a7a4c0909dfd8872f52ed7"),
    "level1" : {
        "level2" : [
            [
                "item00",
                "item01"
            ],
            [
                "item10",
                "item11"
            ]
        ]
    }
}

以下至少一项应该有效,对吧?

> db.nested.findOne({'level1.level2.0': {'$in': ['item00']}})
null

> db.nested.findOne({'level1.level2': {'$in': ['item00']}})
null

有什么想法吗?我们正在考虑放弃MongoDB,如果查询语法不像宣传的那样工作。

谢谢!

共有3个答案

澹台博文
2023-03-14

简答:$in表示单个值字段,$all表示数组。

首先,db.nested.findOne({'level1.level2.0':'item00'})不起作用,因为level1.level2.0保存了一个数组,您正试图将其与单个值进行比较。

现在,< code > db . nested . findone({ ' level 1 . level 2.0 ':{ ' $ in ':[' item 00 ']} })也因为类似的原因无法工作。$in用于将具有单个值的字段(您有一个数组)与数组中的几个值(在查询中指定)进行比较。$in在说:给我包含这个字段的文档,这个字段的值包含在这个数组中。

$all正在工作,因为它说:给我包含此字段的多个值的文档,并且此数组的所有值(在查询中)都包含在该字段中。(已编辑)

可能很难得到,但看看每个留档都写了什么:

$all选择字段包含数组并包含所有元素的文档(例如

$in选择字段值等于指定数组中任何值的文档(< code >例如

希望对你有帮助

邵城
2023-03-14

使用嵌套elemMatch在数组中搜索嵌套级别。

详细信息在MongoDB中查询数组

东方新霁
2023-03-14

运行一些查询后,我得出的结论是$in不适用于数组数组。

您可以使用<code>$elemMatch</code>来代替它,它会起作用,但令人沮丧的是MongoDB的文档没有对此发出警告。

我创建了这个文档:

{
      "_id": "51cb12857124a215940cf2d4",
      "level1": [
        [
          "item00",
          "item01"
        ],
        [
          "item10",
          "item11"
        ]
      ],
      "items": [
        "item20",
        "item21"
      ]
}

请注意,字段“项目”是一个字符串数组,此查询非常有效:

db.nested.findOne({"items":{"$in":["item20"]} })

现在,“level1.0”也是一个字符串数组,唯一的区别是它在另一个数组里面。该查询应该可以工作,但却不能:

db.nested.findOne({"level1.0":{"$in":["item00"]} })

获得结果的唯一方法是使用 $elemMatch:

db.nested.findOne({"level1":{"$elemMatch":{"$in":['item00']}} })

所以$elemMatch解决了这个问题,但真正的解决方案是将MongoDB的文档更新为$in不适用于数组数组的状态。也许您应该向 10gen 提交请求。

 类似资料:
  • 我需要有关嵌套对象数组的查询优化的帮助。 我们有大量文档的集合,每个文档都包含嵌套的对象数组,最高可达3rd级,如下所示: 集合名称:产品 收集文件总数:2000万 每个文档的大小: 我为我的产品集合添加了以下索引,如下所示:, > products.id索引 { “id”:1 } 嵌套数组文档的索引 { " products . sellers . seller _ id ":1 } 我的疑问:

  • 我试图用C#在MongoDB中用嵌套数组文档实现文本搜索功能。我有一个以下格式的MongoDB集合。

  • 如何根据数组的嵌套数组中的两个值参数进行查询?目标是返回具有和。 尝试了以下查询但没有成功。

  • 问题内容: 我对mongodb还是很陌生,有一件事我现在无法解决: 假设您有以下文档(简体): 哪个查询将返回json-object,其值等于“ value2”? 这意味着,我需要这个json-object: 当然,我已经尝试了很多可能的查询,但是没有一个返回正确的查询,例如 有人可以帮我看看我在做什么错吗? 谢谢! 问题答案: 使用位置运算符 输出量 使用聚合 输出 使用Java驱动程序 输出

  • 我正在尝试更新嵌套数组中的值,但无法使其工作。 我的对象是这样的 提前谢谢!

  • 问题内容: 我有以下mongodb文件结构: 我已经能够使用$ elemMatch来更新操作中的字段,但是当我尝试对参数执行相同的操作(修改)时,它似乎不起作用。我想知道我应该尝试哪种其他方法,以便能够成功更新特定参数中的字段(通过其pid查找)。 我当前拥有但不起作用的更新代码如下所示: 问题答案: MongoDB 3.6及更高版本 MongoDB3.6及更高版本提供了一项新功能,该功能允许您使