0

有没有办法在没有数据的情况下确定 mongodb 中集合的结构?假设我有一个包含多个文档的集合。假设前 10 个文档有 10 个属性,接下来的 10 个有 12 个(10 + 2 个新)属性。我正在寻找的只是集合中没有数据的文档的通用 json 布局。这相当于 RDBMS 中的表描述(Oracle 中的 desc table_name 或 SQL Server 中的 sp_help table_name)。如果你们中的任何人以前尝试过,我将不胜感激。

4

2 回答 2

1

编辑:你可能想看看这个工具https://github.com/variety/variety


没有这样的命令,因为 mongo 中的集合必须支持完全异构的文档集。虽然这不是一个好的设计,但以下是完全合法的并得到支持:

> db.foo.insert({"a" : 1})
> db.foo.insert({"a" : "a string"})
> db.foo.insert({"b" : []})
> db.foo.find().pretty()
{ "_id" : ObjectId("51c19d7a3997c43593afcfed"), "a" : 1 }
{ "_id" : ObjectId("51c19d813997c43593afcfee"), "a" : "a string" }
{ "_id" : ObjectId("51c19d8a3997c43593afcfef"), "b" : [ ] }

您希望这种行为起作用的唯一方法是,如果它返回“_id”作为唯一的公共字段,您已经知道这是一个公共字段。当然,两个字段都有“a”,但是键“a”的值可能是不同的类型。

您可以期望的最好的解决方案是@Munim 建议的一些解决方案,假设如下所示。

function common_keys(coll) {
  function array_intersection(a,b) {
    return a.filter(function(n) {
      if(b.indexOf(n) == -1)
        return false;
      return true;
    });
  }

  var cur = coll.find();
  var common_keys_in_collection = Object.keys(cur.next());

  while (cur.hasNext()) {
    var document_keys = Object.keys(cur.next())
    common_keys_in_collection = array_intersection(common_keys_in_collection, document_keys)
  }

  return common_keys_in_collection
}

请注意,示例代码不处理深度嵌套的结构,因此不会在子文档中找到公共键。

于 2013-06-19T12:28:04.500 回答
0

我认为没有任何命令可以做到这一点。但是你可以做的是编写一个程序来获取集合中的所有文档,循环遍历每个文档,并在你的模式结构中为每个文档添加键。

于 2013-06-19T11:54:16.427 回答