【问题标题】:Get a document in MongoDB without specifying collection在 MongoDB 中获取文档而不指定集合
【发布时间】:2017-07-08 16:00:07
【问题描述】:

MongoDB ID 对于单个数据库集群是唯一的。是否可以在不指定集合名称的情况下使用其 ID 获取文档?

如果是,怎么做?

如果没有,为什么不呢?

【问题讨论】:

    标签: mongodb database nosql


    【解决方案1】:

    是的,但不是以可扩展的方式(因为您必须查询每个集合)。如果您有 2 或 3 个系列,这可能没问题,但是……您可能应该检查您的设计以找出您这样做的原因。顺便问一下,你为什么会这样?

    1. 您将获得数据库中所有集合的列表。
    2. 您遍历它们,并根据 _id 进行查询

    示例外壳代码:

    db.test1.save({});
    db.test2.save({});  
    db.test3.save({});
    db.test4.save({});
    db.test5.save({}); 
    db.test6.save({});
    
    db.test2.findOne(); // gives: { "_id" : ObjectId("4f62635623809b75e6b8853c") }
    
    db.getCollectionNames().forEach(function(collName) {
       var doc = db.getCollection(collName).findOne({"_id" : ObjectId("4f62635623809b75e6b8853c")});
       if(doc != null) print(doc._id + " was found in " + collName); 
    });  
    

    给:4f62635623809b75e6b8853c was found in test2

    【讨论】:

      【解决方案2】:

      ObjectId 旨在全球唯一(全球范围内,而不仅仅是在单个集群中)。几乎是这样。

      它包括时间、机器 ID、进程 ID 和一个随机数。但是,它不包括数据库或集合名称。因此,仅使用 id 来获取文档是不可能的。您还必须提供数据库和集合名称。

      【讨论】:

      • 但我对收藏不感兴趣——我对对象本身感兴趣!换句话说,我不介意不知道获取的对象属于哪个集合。这是否意味着数据库中没有一个包含所有对象的单一列表?
      • 也不会有这样的列表。 ObjectId 是全局唯一的,但您不必为文档 ID 使用一个。你可以使用几乎任何你想要的字符串,并且只让它在集合中是唯一的。因此,Mongo 无法根据 id 确定集合。
      猜你喜欢
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 2012-06-04
      • 2021-07-06
      相关资源
      最近更新 更多