提问者:小点点

列出mongoDB对象中的字段


我正在开发一个系统,其中项目可以通过访问密钥与其他用户共享。我将访问密钥存储为share info对象(嵌入项目文档中)中的字段,如下所示:

shareinfo:{
    ........
    <nth key>: <permissions object - may be complex and large>
    ........
}

当一个项目被访问时,我检查shareinfo. key并查找它是否有效。

目前,为了列出键,我在内存中加载(Java)整个share info对象并在其上运行keySet()以检索和返回键,而其余数据则被浪费了。

问题是:我想在没有随附数据的情况下获取键列表(即对象字段名称)(因为在某些情况下权限对象明显很大)。

我在mongoDB文档中找不到此类查询的任何查询。我想知道这是否可能?或者有没有优化的方法将字段名称列表加载到应用程序中而不附带字段值?


共3个答案

匿名用户

在尝试使用mongoDB shell了解现有mongoDB数据库的结构时,我遇到了同样的问题。然后我发现我可以使用JavaScript函数Object. key()来检索对象字段的数组。(使用MongoDb 2.4.2进行测试)

Object.keys(db.collection.findOne())

匿名用户

MongoDB采用无模式设计,这意味着任何文档都可以包含与任何其他文档不同的字段。要获得所有文档的所有字段的详尽列表,您需要遍历集合中的所有文档并枚举每个字段。对于任何合理大小的集合,这将是一个极其昂贵的操作。

有几个帮助程序使这变得更加简单:Variete和schema. js。它们都允许您限制检查的文档,并且它们还报告覆盖率。两者都相当于对集合进行映射/减少,但至少比自己编写一个简单。

匿名用户

如果你只是在所有文档中寻找顶级字段(不关心子字段和综艺提供的所有细节统计)

这是一句话

db.things.aggregate([{$project: {arrayofkeyvalue: {$objectToArray: "$$ROOT"}}}, {$unwind:"$arrayofkeyvalue"}, {$group:{_id:null, allkeys:{$addToSet:"$arrayofkeyvalue.k"}}}])