MongoDB / Morphia - 投影无法处理递归对象?

时间:2014-12-27 20:42:37

标签: mongodb mongodb-query morphia nosql

我有一个测试对象,它作为树上的节点,包含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)当我进行投影时,它仅适用于顶部元素。 children元素仍然返回不在投影中的其他属性(stringValue和creationDate)。我希望字段选择适用于所有相同类型的文档和子文档。此树具有一定数量的子项,因此我无法在查询中明确指定。怎么做到这一点?

2)令我惊讶的是,限制适用于子文档!你看到有一个id为6的嵌入式文档。我期待看到6个带有N个子文档的顶级文档,但只得到5个。如何告诉MongoDB返回6个顶级元素,无论它们嵌入了什么?如果没有一致的分页系统是不可能的。

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

1 个答案:

答案 0 :(得分:1)

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

至于2),听起来并不合适。在没有添加投影的情况下查看查询结果会很有帮助(每个返回文档中都有完整的文档),我们可以从那里获取。