【问题标题】:How to do querying, sorting and filtering on values of an object in mongodb?如何在mongodb中对对象的值进行查询、排序和过滤?
【发布时间】:2017-02-08 12:14:02
【问题描述】:

我正在尝试找到一种方法来对 mongo 文档中的对象(又是一个对象)的值进行查询、排序和过滤。文档结构是,

{
    _id: '',
    uid: '12345',
    objects:{
        dkey1: {
            prop1: val1,
            prop2: val2,
            ...
        },
        dkey2: {
            prop1: val1,
            prop2: val2,
            ...
        },
        dkey3: {
            prop1: val1,
            prop2: val2,
            ...
        },
        dkey4: {
            prop1: val1,
            prop2: val2,
            ...
        }
        ...
    }
}

objects 属性可以包含 1000 个具有动态键的对象。它们是基于哈希的唯一键。当我得到这些对象时,我不想全部归还。我想查询、排序、限制,因为如果它们来自不同的文档,就可以做到。例如,如果我说prop1 = val1prop2 限制10 排序,则查询应返回objects 中的前10 个子对象,其中它们的prop1val1,按prop2 排序。

我认为普通的find 无法做到这一点。所以,我正在尝试使用聚合框架。在第一阶段,我将在uid 上进行匹配。下一个?我在那里很困惑。如果它是一个对象数组,而不是具有动态键的对象,我可以做$unwind,在进一步的阶段,我可以对内部属性进行过滤(prop1prop2...),排序和应用限制等。但问题是,它不是对象数组。如果有办法将 objects 对象的值转换为对象数组,那会更容易。我一直在寻找方法,但找不到解决方案。

我知道结构不好,更改架构会对我有所帮助。但我现在处于一种情况,我无法改变它。有没有办法将objects 的值转换为对象数组?或者是否有不同的方法可以通过其他一些聚合管道阶段实现相同的结果?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    为什么不能用正常的查找来完成?根据documents 聚合操作是“将多个文档中的值组合在一起”,如果我理解正确,那不是你想要在这里做的。

    试试这个:

    db.objects.find({prop1: 'val1'}).sort({prop2: 1}).limit(10)
    

    这是在 mongo shell 中测试的

    • 对象将是您的收藏
    • 排序中的数字1表示升序,-1表示降序
    • 限制上的数字10当然是限制值

    --- 编辑 ----

    如果您想访问另一个文档中的文档属性,请使用点符号。

    例如:db.objects.find({'nestedobj.prop1': 'val1'})

    --- 编辑 2 ---

    现在我明白我误解了你的问题。对不起。这里的问题是,我认为没有一个运算符可以让您访问任何嵌入式文档(我真的不知道,我可以查看它,但现在不行)。

    但也许我可以帮助您告诉您,如果您要使用“聚合”,“$match”将用于过滤结果,因此 uid 不会处于该管道阶段。 MongoDB 2.4 提供了对在数据库中执行的 Javascript 函数的支持,但聚合框架的目的,正如我之前告诉你的,是映射减少文档,所以这不是最好的情况。我会关心数据库引擎完成您想要的性能和能力。但我认为在驳回这个想法之前应该对其进行测试。

    再次抱歉误解了您的问题,希望您能解决您的问题。让我知道你是否这样做以及如何做!

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2014-10-17
      相关资源
      最近更新 更多