Mongodb 如何选择嵌入文档列表作为根元素

Mongodb 如何选择嵌入文档列表作为根元素,mongodb,aggregation-framework,nosql,Mongodb,Aggregation Framework,Nosql,我正在使用MongoDB和MongoDriver。下面是我的数据示例。我想找到所有“类别”中所有“交易”的列表。如何使用collection.find方法获取所有事务的列表?查询是否需要在根级别进行“事务” 这是我的文件: /* 0 */ { "_id" : ObjectId("53791916a33e851d2c7ec8f0"), "name" : "Shopping", "transactions" : [ { "_id" :

我正在使用MongoDB和MongoDriver。下面是我的数据示例。我想找到所有“类别”中所有“交易”的列表。如何使用collection.find方法获取所有事务的列表?查询是否需要在根级别进行“事务”

这是我的文件:

/* 0 */
{
    "_id" : ObjectId("53791916a33e851d2c7ec8f0"),
    "name" : "Shopping",
    "transactions" : [ 
        {
            "_id" : ObjectId("53791916a33e851d2c7ec8ee"),
            "date" : "12/01/2012",
            "description" : "mid week",
            "amount" : 12
        }, 
        {
            "_id" : ObjectId("53791916a33e851d2c7ec8ef"),
            "date" : "12/01/2012",
            "description" : "end of week",
            "amount" : 5
        }
    ]
}

/* 1 */
{
    "_id" : ObjectId("53791a63a33e851d2c359290"),
    "name" : "Entertainment",
    "transactions" : [ 
        {
            "_id" : ObjectId("53791a63a33e851d2c35928e"),
            "date" : "12/01/2012",
            "description" : "games",
            "amount" : 70
        }, 
        {
            "_id" : ObjectId("53791a63a33e851d2c35928f"),
            "date" : "12/01/2012",
            "description" : "films",
            "amount" : 20
        }
    ]
}
在robomongo中,我使用:db.Categories.find({},{u id:0,事务:1})

并获得:

/* 0 */
{
    "transactions" : [ 
        {
            "_id" : ObjectId("53791916a33e851d2c7ec8ee"),
            "date" : "12/01/2012",
            "description" : "mid week",
            "amount" : 12
        }, 
        {
            "_id" : ObjectId("53791916a33e851d2c7ec8ef"),
            "date" : "12/01/2012",
            "description" : "end of week",
            "amount" : 5
        }
    ]
}

/* 1 */
{
    "transactions" : [ 
        {
            "_id" : ObjectId("53791a63a33e851d2c35928e"),
            "date" : "12/01/2012",
            "description" : "games",
            "amount" : 70
        }, 
        {
            "_id" : ObjectId("53791a63a33e851d2c35928f"),
            "date" : "12/01/2012",
            "description" : "films",
            "amount" : 20
        }
    ]
}
这不是我想要的,查询应该返回:

        {
            "_id" : ObjectId("53791916a33e851d2c7ec8ee"),
            "date" : "12/01/2012",
            "description" : "mid week",
            "amount" : 12
        }

        {
            "_id" : ObjectId("53791916a33e851d2c7ec8ef"),
            "date" : "12/01/2012",
            "description" : "end of week",
            "amount" : 5
        }

        {
            "_id" : ObjectId("53791a63a33e851d2c35928e"),
            "date" : "12/01/2012",
            "description" : "games",
            "amount" : 70
        }

        {
            "_id" : ObjectId("53791a63a33e851d2c35928f"),
            "date" : "12/01/2012",
            "description" : "films",
            "amount" : 20
        }

提前感谢…

任何时候,如果您想改变输出的结构,您通常会希望使用
聚合
而不是
查找
。在这种情况下,您可以使用
$unwind
$group
操作符来实现所需的功能

在外壳中:

db.test.aggregate([
//复制每个单据,每个交易元素复制一次。
{$unwind:'$transactions'},
//将事务重新组合到一个大数组中。
{$group:{{u id:null,事务:{$push:'$transactions'}}
])
输出:

{
“结果”:[
{
“_id”:空,
“交易”:[
{
“_id”:ObjectId(“53791916a33e851d2c7ec8ee”),
“日期”:“2012年1月12日”,
“说明”:“周中”,
“金额”:12
}, 
{
“_id”:ObjectId(“53791916a33e851d2c7ec8ef”),
“日期”:“2012年1月12日”,
“说明”:“周末”,
“金额”:5
}, 
{
“_id”:ObjectId(“53791a63a33e851d2c35928e”),
“日期”:“2012年1月12日”,
“说明”:“游戏”,
“金额”:70
}, 
{
“_id”:ObjectId(“53791a63a33e851d2c35928f”),
“日期”:“2012年1月12日”,
“描述”:“电影”,
“金额”:20
}
]
}
],
“好”:1
}

为什么会有人投反对票?我是mongodb的新手,这是一个真正的问题……如果你打算否决投票,至少要留下评论。或者只需
$project
交易字段,而不是
$group
,因为它仍然给出结果,而且成本应该更低。运行MongoDB 2.6及更高版本时非常方便,因为所有结果都是光标,而不是一个文档。