所以这是学习Mongo Db的第3天。我来自MySql宇宙......
很多时候,当我需要为我不熟悉的MySql表编写查询时,我会使用“desc”命令 - 基本上告诉我应该在查询中包含哪些字段。
我如何为Mongo数据库做到这一点?我知道,我知道......我正在无模式数据库中搜索模式。 =)但是用户怎么知道在他们的查询中使用哪些字段呢?
我是以错误的方式去做的吗?显然我正试图在Mongo数据库中使用MySql方式做事。什么是Mongo方式?
答案 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]}`)
};