【问题标题】:Is there a way to find collection Name from a field name in Mongo DB Query有没有办法从 Mongodb 查询中的字段名称中找到集合名称
【发布时间】:2021-12-27 12:13:26
【问题描述】:

我是 Mongo DB 和 NoSQL 世界的新手。我试图在 Mongo DB 中找到与 Oracle 的 dba_tab_cols 等效的东西。我的意图是,如果我知道一个字段名称,我应该能够通过查询找出所有集合具有该字段的内容。在 Mongo DB 中甚至有可能吗?

【问题讨论】:

  • @prasad_ 的答案是完全正确的,但是 MongoDB 不像您从关系数据库中知道的那样工作。当您将数据插入不存在的集合时,会自动创建一个新集合。当您选择不存在的集合/字段时,您只需获得 null 值。 MongoDB 中不存在 Collection does not existInvalid field name 之类的错误。
  • 如果您想创建具有预定义结构和字段约束/验证的集合 - 使用可选的Schema Validation。这允许在插入和更新操作期间进行验证。

标签: mongodb mongodb-query


【解决方案1】:

例如,如果您要查找字段为 name 的集合:

var collections = db.getCollectionNames()
var matches = []
for (let coll of collections) {
    let result = db[coll].findOne({ name: { $exists: true }})
    if (result) matches.push(coll)
}

printjson(matches)

请注意,这将包括字段存在的位置,并且即使值为 null 也包括在内。因此,如果您想排除那些字段值为null 的集合,请使用以下过滤器:

let result = db[coll].findOne({ name: { $exists: true, $ne: null }})

对于包含您要查找的值的 子字符串 的字段,请使用正则表达式。例如,如果您正在查找字段名称包含 name 的集合,这将匹配字段名称“firstName”、“lastName”和“name”。

let result = db[coll].aggregate([
    { $project: { flds: { "$objectToArray": "$$ROOT" }}}, 
    { $match: { "flds.k": /name/ }},
    { $limit: 1 }
]).hasNext()

注意:

  • 这从mongo shell 运行。
  • 这些脚本在嵌套对象和数组中查找对象。
  • 这些仅在当前数据库中查找集合。要在所有数据库中搜索,您可以尝试:

var dbNames = db.adminCommand({ listDatabases: 1, nameOnly: true })["databases"].map(d => d.name)
for (let dbname of dbNames) {
    let collections = db.getSiblingDB(dbname).getCollectionNames()
    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2011-01-23
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多