根据类型和祖先字段从mongo db获取记录

时间:2013-05-11 13:50:11

标签: mongodb

mongodb记录中的

就像这样存储

{_id:100,type:"section",ancestry:nil,.....}
{_id:300,type:"section",ancestry:100,.....}
{_id:400,type:"problem",ancestry:100,.....}
{_id:500,type:"section",ancestry:100,.....}
{_id:600,type:"problem",ancestry:500,.....}
{_id:700,type:"section",ancestry:500,.....}
{_id:800,type:"problem",ancestry:100,.....}

我想按照这样的顺序获取记录 第一个记录,其祖先是零 然后所有记录的父母是我们搜索的第一条记录,其类型是“问题” 然后所有记录的父记录是我们搜索的第一个记录,其类型是'section'

预期输出

{_id:100,type:"section",ancestry:nil,.....}
{_id:400,type:"problem",ancestry:100,.....}
{_id:800,type:"problem",ancestry:100,.....}
{_id:300,type:"section",ancestry:100,.....}
{_id:500,type:"section",ancestry:100,.....}
{_id:600,type:"problem",ancestry:500,.....}
{_id:700,type:"section",ancestry:500,.....}

2 个答案:

答案 0 :(得分:1)

试试这个MongoDB shell命令:

db.collection.find().sort({ancestry:1, type: 1})

有序词典不可用的不同语言可以使用排序参数的2元组列表。像这样的东西(Python):

collection.find({}).sort([('ancestry', pymongo.ASCENDING), ('type', pymongo.ASCENDING)])

答案 1 :(得分:1)

@vinipsmaker的回答很好。但是,如果_id是随机数或存在不属于树结构的文档,则它无法正常工作。在这种情况下,以下代码可以正常工作:

function getSortedItems() {
    var sorted = [];
    var ids = [ null ];
    while (ids.length > 0) {
        var cursor = db.Items.find({ ancestry: ids.shift() }).sort({ type: 1 });
        while (cursor.hasNext()) {
            var item = cursor.next();
            ids.push(item._id);
            sorted.push(item);
        }
    }
    return sorted;
}

请注意,此代码速度不快,因为db.Items.find()将执行n次,其中n是树结构中的文档数。

如果树结构很大或者你会多次进行排序,你可以在查询中使用$in operator来优化它,并在客户端对结果进行排序。

此外,在ancestry字段上创建索引会使代码更快。