在MongoDB中获取文档而不指定集合

10

MongoDB的ID对于单个数据库集群是唯一的。是否可以通过ID获取文档,而不需要指定集合名称?

如果可以,如何实现?

如果不行,为什么不行?

2个回答

12

可以这样做,但不具有可扩展性(因为您必须查询每个集合)。如果您只有 2 或 3 个集合,那么这可能还可以,但是...您应该检查一下设计,找出为什么要这样做。顺便问一下,您为什么要这样做呢?

  1. 获取数据库中所有集合的列表。
  2. 循环遍历它们,并基于 _id 进行查询。

示例 shell 代码:

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 在 test2 中被发现


2

ObjectId旨在全球范围内(不仅限于单个集群)具有全局唯一性。而且它基本上是如此。

它包括时间、机器ID、进程ID和一个随机数。但是,它不包括数据库或集合名称。因此,仅使用ID无法获取文档。您还需要提供数据库和集合名称。


2
但是我对集合本身并不感兴趣!换句话说,我不介意不知道获取的对象属于哪个集合。这是否意味着没有一个包含数据库中所有对象的单一列表? - sssilver
2
也永远不会有这样的列表。ObjectId是全局唯一的,但您不必使用它作为文档ID。您可以使用几乎任何字符串,并且只需在集合内部保持唯一即可。因此,Mongo无法从ID确定集合。 - Tim Gautier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接