【问题标题】:Listing fields in a mongodb object列出 mongodb 对象中的字段
【发布时间】:2013-04-26 14:20:52
【问题描述】:

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

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

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

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

问题来了:我想获取没有附带数据的键列表(即对象字段名称)(因为在某些情况下权限对象非常大)。

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

【问题讨论】:

  • 恐怕不行。您可以检查一个字段是否存在,但您无法获取它们的列表。
  • 我想最好的办法是让权限对象尽可能小。顺便说一句,你知道这件事是否计划在未来吗?

标签: mongodb


【解决方案1】:

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

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

【讨论】:

  • 这真的很有帮助,我很惊讶这没有很好的记录 - 谢谢!
  • 这只是 JavaScript 的基础知识,只看 JavaScript 文档,而不是 mongodb。 developer.mozilla.org/en/docs/Web/JavaScript/Reference/… 顺便说一下,这个查询将显示第一个文档的键,而不是全部。
【解决方案2】:

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

有几个助手可以让这更简单:Varietyschema.js。它们都允许您限制检查的文件,并且它们也报告覆盖范围。两者都相当于对集合进行 map/reduce,但至少比必须自己编写更简单。

【讨论】:

  • 知道如何从 java 驱动程序本身进行枚举吗?另外,如果我指定文档,那么我猜枚举会非常快速和高效..
  • 我不是最伟大的 Java 开发人员,但我已经整理了一个示例程序来演示该技术。它位于pastie。它基本上在“yourcollection”中找到第一条记录,并将关键字段列表打印到 System.out。
  • 谢谢!效果很好...我们公司实际上已经开始研究 MongoDB 源代码以在后端实现此功能以及其他一些功能...
猜你喜欢
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2016-08-03
  • 1970-01-01
  • 2020-05-20
  • 2021-01-09
相关资源
最近更新 更多