【问题标题】:mongodb query in childs not known未知子项中的 mongodb 查询
【发布时间】:2018-08-27 23:04:18
【问题描述】:

我正在开发 mongodb。 我希望能够通过省略一级来搜索子节点。

让我们想象以下文档:

{
    "node1": {
        "node2": {
            "node3": "test"
        },
        "node2a": {
            "node3": "testa"
        },
        "node2b": {
            "node3": "test"
        },
        "node2c": {
            "node3": "test"
        },
        "node2d": {
            "node3": "testa"
        }
    }
}

如果我想退货,我可以这样做:

{ "node1.node2a.node3" : "testa" }

问题是我将不得不搜索大量具有不同“node2”值的文档,因为它是随机生成的。但是 node1 和 node3 是已知的。

现在我想知道是否可以这样做:

{ "node1.WHATEVER.node3" : "testa" }

可行吗?

提前致谢

【问题讨论】:

标签: mongodb


【解决方案1】:

您可以通过使用聚合:addFields aggregation stage$objectToArray operator 来实现此目的,然后匹配并删除添加的字段。

db['01'].aggregate(
    [
        {
            $addFields: {
              "newNode1":{$objectToArray:"$node1"}
            }
        },
        {
            $match: {
            "newNode1.v.node3":"testa"
            }
        },
        {
            $project: {
                newNode1:0
            }
        },
    ]
);

这将提供所有包含“testa”作为 node3 值的文档。

$addFields 与 $objectToArray 将产生以下结构,然后 $match 并删除与 $project 创建的字段。

{ 
    "_id" : ObjectId("5b840cdf0b354c1b829a19fc"), 
    "node1" : {
        "node2" : {
            "node3" : "test"
        }, 
        "node2a" : {
            "node3" : "testa"
        }, 
        "node2b" : {
            "node3" : "test"
        }, 
        "node2c" : {
            "node3" : "test"
        }, 
        "node2d" : {
            "node3" : "testa"
        }
    }, 
    "newNode1" : [
        {
            "k" : "node2", 
            "v" : {
                "node3" : "test"
            }
        }, 
        {
            "k" : "node2a", 
            "v" : {
                "node3" : "testa"
            }
        }, 
        {
            "k" : "node2b", 
            "v" : {
                "node3" : "test"
            }
        }, 
        {
            "k" : "node2c", 
            "v" : {
                "node3" : "test"
            }
        }, 
        {
            "k" : "node2d", 
            "v" : {
                "node3" : "testa"
            }
        }
    ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2017-02-19
    • 2020-01-16
    • 2016-02-08
    相关资源
    最近更新 更多