我如何描述Mongo中的集合?

时间:2011-06-13 22:06:21

标签: mongodb

所以这是学习Mongo Db的第3天。我来自MySql宇宙......

很多时候,当我需要为我不熟悉的MySql表编写查询时,我会使用“desc”命令 - 基本上告诉我应该在查询中包含哪些字段。

我如何为Mongo数据库做到这一点?我知道,我知道......我正在无模式数据库中搜索模式。 =)但是用户怎么知道在他们的查询中使用哪些字段呢?

我是以错误的方式去做的吗?显然我正试图在Mongo数据库中使用MySql方式做事。什么是Mongo方式?

12 个答案:

答案 0 :(得分:30)

在editor / mongoshell中输入以下查询

var col_list= db.emp.findOne();
for (var col in col_list) { print (col) ; }

输出将为您提供集合中列的名称:

_id
name
salary

答案 1 :(得分:21)

这里没有好的答案。由于没有架构,因此您无法“描述”该集合。但是,在许多(大多数?)MongoDb应用程序中,模式由编写应用程序(java或c#或其他)中使用的对象层次结构定义,因此您可以反映对象库以获取该信息。否则会有一些试验和错误。

答案 2 :(得分:18)

这是我30天或类似于使用MongoDB的东西。不幸的是,由于我公司当前的基础设施问题,我们在使用MongoDB后已经切换回MySQL。但是在MongoDB和MySQL上实现了相同的模型,我现在可以清楚地看到它们的区别。

当然,在处理像MongoDB这样的无模式数据库时会涉及一个模式,但模式是由应用程序而不是数据库决定的。无论给出什么,数据库都会推进。只要您知道管理员没有秘密登录到Mongo并进行更改,并且对数据库的所有访问都是通过某些wrapper进行控制的,那么您应该查看模式的唯一地方就是模型类。例如,在我们的Rails应用程序中,这些是Mongo中的两个模型,

class Consumer
    include MongoMapper::Document

    key :name, String
    key :phone_number, String
    one :address
end

class Address
    include MongoMapper::EmbeddedDocument

    key :street, String
    key :city, String
    key :state, String
    key :zip, String
    key :state, String
    key :country, String
end

现在切换到MySQL后,我们的类看起来像这样,

class Consumer < ActiveRecord::Base
    has_one :address
end

class Address < ActiveRecord::Base
    belongs_to :consumer
end

不要被班级的简洁所迷惑。在MySQL的后一版本中,字段是直接从数据库中提取的。在前面的例子中,田野就在我们眼前。

使用MongoDB,如果我们必须更改特定模型,我们只需添加,删除或修改类本身中的字段,它就可以正常工作。我们不必担心保持数据库表/列与类结构同步。因此,如果您正在寻找MongoDB中的架构,请查看您的应用程序以获取答案,而不是数据库。

基本上我说的与@Chris Shain完全相同:)

答案 3 :(得分:9)

我也有这个需求,Cavachon。所以我创建了一个名为Variety的开源工具,它正是这样做的:link

希望你会发现它很有用。如果您有任何问题或使用它有任何问题,请与我们联系。

祝你好运!

答案 4 :(得分:6)

虽然事实上是正确的,但你所做的一切都太复杂了。我认为OP只是想知道他/她的数据是什么样的。如果是这种情况,你可以

db.collectionName.findOne()

这将以漂亮的格式在数据库中显示一个文档(也就是记录)。

答案 5 :(得分:4)

AFAIK,没有办法,这是合乎逻辑的。

MongoDB无架构允许单个集合具有包含不同字段的文档。因此,实际上不可能有对集合的描述,例如关系数据库中表的描述。

尽管如此,大多数应用程序都会为其集合维护一个架构,正如Chris所说,这是由您的应用程序强制执行的。

因此,您不必担心首先获取可用的密钥来进行查询。您可以向MongoDB询问任何密钥集(即查询的投影部分)或查询任何密钥集。在这两种情况下,如果指定的密钥存在于文档中,则使用它们,否则它们不会。你不会得到任何错误。

例如(在mongo shell上):

如果这是people集合中的示例文档,并且所有文档都遵循相同的模式:

{
  name : "My Name"
  place : "My Place"
  city : "My City"
}

以下是完全有效的查询:

这两个将返回上述文件:

db.people.find({name : "My Name"})
db.people.find({name : "My Name"}, {name : 1, place :1})

这不会返回任何内容,但也不会引发错误:

db.people.find({first_name : "My Name"})

这将匹配上述文档,但您在返回的文档中只有默认的“_id”属性。

db.people.find({name : "My Name"}, {first_name : 1, location :1})

答案 6 :(得分:4)

print('\n--->', Object.getOwnPropertyNames(db.users.findOne())
  .toString()
  .replace(/,/g, '\n---> ') + '\n');
---> _id
---> firstName
---> lastName
---> email
---> password
---> terms
---> confirmed
---> userAgent
---> createdAt

答案 7 :(得分:1)

如果您可以运行Map / Reduce,则可以收集所有可能的文档字段。

this post开始。

这里唯一的问题是你正在运行Map / Reduce,这可能是资源密集型的。相反,正如其他人所建议的那样,您将需要查看写入实际数据的代码。

仅仅因为数据库没有架构并不意味着 没有架构。一般来说,架构信息将在代码中。

答案 8 :(得分:1)

我写了一个可以帮助你的小mongo shell脚本。 https://gist.github.com/hkasera/9386709

如果有帮助,请告诉我。

答案 9 :(得分:0)

您可以为mongoDb使用UI工具mongo指南针。这将显示该集合中的所有字段,并显示其中的数据变化。

答案 10 :(得分:0)

如果您正在使用NodeJS并希望使用API​​请求获取所有字段名称,则此代码适用于我 -

let arrayResult = [];

db.findOne().exec(function (err, docs)){
 if(err)
  //show error

  const JSONobj = JSON.parse(JSON.stringify(docs));
     for(let key in JSONobj) {
       arrayResult.push(key);
     }
  return callback(null, arrayResult);
}

arrayResult将为您提供整个字段/列名称

输出 -

[
 "_id",
 "emp_id",
 "emp_type",
 "emp_status",
 "emp_payment"
]

希望这适合你!

答案 11 :(得分:0)

这是一个不完整的解决方案,因为它没有提供确切的类型,但是对快速查看很有用。

const doc = db.collectionName.findOne();
for (x in doc) {
  print(`${x}: ${typeof doc[x]}`)
};