1

我在 MongoDB 中存储了一些树结构的数据。它看起来像这样:

{
    "_id": 1,
    "name": "foo",
    "subs": [{
        "name": "bar",
        "subs": [{
            "name": "baz"
        },
        {
            "name": "gizmo"
        }]
    }]
}
{
    "_id": 2,
    "name": "foo",
    "subs": [{
        "name": "bar",
        "subs": [{
            "name": "gizmo"
        }]
    }]
}

我想查询子树,并且只希望提取与查询匹配的树部分。在每个节点中,最多有一个与查询匹配的子树。

在这个测试查询中,我想找到与路径“foo/bar/gizmo”匹配的树部分。所以,我尝试了以下方法:

db.Test.find({
    name: "foo",
    subs: {
        $elemMatch: {
            name: "bar",
            subs: {
                $elemMatch: {
                    name: "gizmo"
                }
            }
        }
    }
},
{
    "subs.subs": {
        $slice: 1
    }
})

我得到的结果是

{
    "_id": 1,
    "name": "foo",
    "subs": [{
        "name": "bar",
        "subs": [{
            "name": "baz"
        }]
    }]
}{
    "_id": 2,
    "name": "foo",
    "subs": [{
        "name": "bar",
        "subs": [{
            "name": "gizmo"
        }]
    }]
}

而我实际上想要

{
    "_id": 1,
    "name": "foo",
    "subs": [{
        "name": "bar",
        "subs": [{
            "name": "gizmo"
        }]
    }]
}{
    "_id": 2,
    "name": "foo",
    "subs": [{
        "name": "bar",
        "subs": [{
            "name": "gizmo"
        }]
    }]
}

是否有可能做到这一点?我曾尝试在子树上使用$elemMatch投影运算符,但似乎 Mongo 目前不支持它(不能在嵌套字段上使用 $elemMatch 投影(当前不受支持))。

4

1 回答 1

0

您可以根据需要使用聚合框架来获得结果。试试下面的代码:

db.Test.aggregate(
{$unwind : "$subs"},
{$unwind : "$subs.subs"},
{$match : {name : "foo", "subs.name" : "bar", "subs.subs.name" : "gizmo"}}
);

结果将是:

"result" : [
    {
        "_id" : ObjectId("52540da2e3a2c44e082642d4"),
        "name" : "foo",
        "subs" : {
            "name" : "bar",
            "subs" : {
                "name" : "gizmo"
            }
        }
    },
    {
        "_id" : ObjectId("52540dd6e3a2c44e082642d5"),
        "name" : "foo",
        "subs" : {
            "name" : "bar",
            "subs" : {
                "name" : "gizmo"
            }
        }
    }
]
于 2013-10-08T14:38:01.623 回答