0

在 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,.....}

我想按顺序获取记录,例如祖先为 nil 的第一条记录,然后是父项是我们搜索的第一条记录且类型为“问题”的所有记录,然后是父项是我们搜索的第一条记录且类型为“部分”的所有记录

预期输出为

{_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,.....}
4

2 回答 2

1

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

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 运算符来优化这一点,并在客户端对结果进行排序。

此外,在ancestry字段上创建索引将使代码在任何一种情况下都更快。

于 2013-05-11T23:07:18.123 回答
1

试试这个 MongoDB shell 命令:

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

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

collection.find({}).sort([('ancestry', pymongo.ASCENDING), ('type', pymongo.ASCENDING)])
于 2013-05-11T16:14:00.973 回答