【问题标题】:MongoDB / Morphia - Projection not working on recursive objects?MongoDB / Morphia - 投影不适用于递归对象?
【发布时间】:2020-11-30 07:41:29
【问题描述】:

我有一个测试对象,它作为树上的节点工作,包含 0 个或多个相同类型的子实例。我将它保存在 MongoDB 上并使用 Morphia 进行查询。

我执行以下查询:

db.TestObject.find( {}, { _id: 1, childrenTestObjects: 1 } ).limit(6).sort( {_id: 1 } ).pretty();

结果:

{ "_id" : NumberLong(1) }
{ "_id" : NumberLong(2) }
{ "_id" : NumberLong(3) }
{ "_id" : NumberLong(4) }
{
        "_id" : NumberLong(5),
        "childrenTestObjects" : [
                {
                        "stringValue" : "6eb887126d24e8f1cd8ad5033482c781",
                        "creationDate" : ISODate("1997-05-24T00:00:00Z")
                        "childrenTestObjects" : [
                                {
                                        "stringValue" : "2ab8f86410b4f3bdcc747699295eb5a4",
                                        "creationDate" : ISODate("2024-10-10T00:00:00Z"),
                                        "_id" : NumberLong(7)
                                }
                        ],
                        "_id" : NumberLong(6)
                }
        ]
}

这太棒了,但也有点令人惊讶。结果有两个问题:

1) 当我进行投影时,它只适用于顶部元素。子元素仍然返回不在投影中的其他属性(stringValue 和 creationDate)。我希望字段选择适用于相同类型的所有文档和子文档。这棵树的子项数量较少,因此我无法在查询中明确指定。如何做到这一点?

2) 令我惊讶的是,限制应用于子文档!您会看到有一个 id 为 6 的嵌入文档。我原本希望看到 6 个包含 N 个子文档的顶级文档,但结果却只有 5 个。如何告诉 MongoDB 返回 6 个顶级元素,而不管其中嵌入了什么?没有一致的分页系统是不可能的。

您的所有帮助使学习 MongoDB 变得更快,我真的很感激!谢谢!

【问题讨论】:

    标签: mongodb mongodb-query morphia nosql


    【解决方案1】:

    对于1),投影会在结果中保留字段。在这种情况下,该字段是childrenTestObjects,它恰好是一个文档。所以 mongo 返回整个字段,当然,整个子文档。投影不是递归的,因此您必须明确指定每个字段。

    至于2),听起来不太对劲。这将有助于查看不添加投影的查询结果(每个返回文档中的完整文档),我们可以从那里获取它。

    【讨论】:

    • 在广泛搜索发生了什么之后,我意识到我的测试数据存在问题。所以#2不是一个有效的问题,它的行为符合预期。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多