【问题标题】:How to select from field name from nested arrays in mongodb?如何从 mongodb 的嵌套数组中选择字段名称?
【发布时间】:2019-02-15 11:31:04
【问题描述】:

我有一个包含嵌套数组的文档,但我不知道如何从 a 字段中选择。

我想选择“组件”具有“桅杆”的所有文档。

我试过了。

db.sites.find({"components": "mast" }).pretty();

db.sites.find({"components.$": "mast" } ).pretty();

db.sites.find({"components.$.$": "mast" } ).pretty();

db.sites.find({"components.$.$.mast": {$exists: true} }).pretty();

db.sites.find({"components.$.mast": {$exists: true} }).pretty();

db.sites.find({"components.mast": {$exists: true} } ).pretty();

还有很多其他失败的尝试。

{
    "_id" : ObjectId("23456yujbvfdfg"),
    "d": 1234567,
    "components" : [
        [
            "mast",
            {
                "foo":"bar"
            }
        ],
        [
            "commsbox",
            {
                "BLARN": "bAAA"
            }
        ]
    ]
}

我的尝试只返回空白结果。

【问题讨论】:

  • 如果组件是一个对象数组呢?您的查询是预期的。对我来说似乎是一个数据建模错误。

标签: mongodb arr


【解决方案1】:

你可以使用$elemMatch

db.sites.find(
   { "components": { $elemMatch:  { $elemMatch:  {$eq:"mast"}  } }}
)

【讨论】:

    【解决方案2】:

    如果您将组件维护为数组,那么您的查询应该如下所示

    db.test.find({ "components": { $elemMatch:  { $elemMatch:  {$eq:"mast"}  } }})
    

    我已经根据您共享的架构发布了解决方案,但我确信架构需要更改

    【讨论】:

    • 我已经更改了架构,因为我太混乱了。
    【解决方案3】:

    这应该可以工作

    db.sites.find({
        "components": {
                $elemMatch: {
                    $elemMatch: { $in: ['mast'] }
                }
        } 
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2019-09-25
      • 2017-09-28
      • 2021-06-08
      • 2020-09-25
      相关资源
      最近更新 更多