mongoDB中的简单查询

时间:2017-04-26 23:14:43

标签: mongodb

我有一个名为constructora的集合,它具有以下结构:

{
    "_id" : A,
    "edificio" : [
        {
            "_id": X,
            "a" : 48,
            "b" : 59  
        },
        {
            "_id": Y,
            "a" : 8,
            "b" : 5  
        },
        {
            "_id": Z,
            "a" : 0,
            "b" : -1  
        },
        ...
    ]
}

所以,我想创建一个查询,为每个子文档( edificio )返回其父 _id 。一个例子:

{
    "_id" : X,
    "a" : 48,
    "b" : 59
    "id_constructora" : A
}
{
    "_id" : Y,
    "a" : 8,
    "b" : 5
    "id_constructora" : A
}
{
    "_id" : Z,
    "a" : 0,
    "b" : -1
    "id_constructora" : A
}

我该怎么做?

修改

现在我正在尝试使用聚合,并使用" edificio_id"对查询进行分组,因此对于edificio中的每个文档,我都可以获得所需的输出:

db.constructora.aggregate(
    [
        { $project : { "_id" : 1, "edificio._id" : 1 } },
        { $group : { _id : "$edificio._id" } }
    ]
).pretty();

但它不起作用。输出是:

...
{
    "_id" : [
        ObjectId("613339376430333562373466"),
        ObjectId("663736363935393066656236"),
        ObjectId("313933613036363364633832"),
        ObjectId("653135313831633638336436")
    ]
}
{
    "_id" : [
        ObjectId("643531326231663739626465"),
        ObjectId("343231386237333365356461"),
        ObjectId("373461303864636138393263"),
        ObjectId("386433623966653737343962"),
        ObjectId("303863633366376431363335"),
        ObjectId("663833343161643639376161"),
        ObjectId("383833363836663532633733"),
        ObjectId("396330313961353137333166"),
        ObjectId("646535366662363364613837"),
        ObjectId("633937613032656436653965")
    ]
}

1 个答案:

答案 0 :(得分:1)

您可以使用$unwind将嵌入式阵列分解为嵌入式文档,$addFields重命名并将_id添加到嵌入式文档中,然后添加$replaceRoot以促进嵌入式文档文档到3.4 mongo服务器的顶层。

db.constructora.aggregate([
   {$unwind:"$edificio"},
   {$addFields:{"edificio.id_constructora":"$_id"}},
   {$replaceRoot: {newRoot: "$edificio"}}
])

此处有更多信息https://docs.mongodb.com/manual/reference/operator/aggregation/replaceRoot/#replaceroot-with-an-array-element