从Mongo中删除STRANGE集合

3
我有一个MongoDB数据库,其中包含一些集合。当我输入命令show collections时,除了我的实际集合之外,我还看到了神秘的[object Object]集合。由于它的名称中含有不良字符,我无法使用或删除它。请问有人能解释一下是什么原因导致出现了这个“集合”,以及如何删除它?
更新: db.getCollectionNames()返回相同的结果: ["[object Object]","my_collection","system.indexes","my_collection1"] 更新2: db.getCollection("[object Object]").drop()起作用了。这种错误的原因仍然不清楚。

可能是无法从mongodb中删除集合的重复问题。至于它为什么会出现,我真的不知道。 - Salvador Dali
这样的集合存在的事实听起来像是一个错误。db.getCollectionNames()的输出有什么不同吗? - mnemosyn
这个集合显示在哪个数据库下? - Dev
@mnemosyn,已更新。没错,似乎是个bug,但可惜我没有注意到是哪个查询引起的。 - MaxPY
我在解决这个问题时有点开心 - 如结尾所述,可能值得在MongoDB jira中创建一个工单,以至少在发生这种情况时进行警告。 - Adam Comerford
1个回答

3
我无法确切地告诉你是如何到达这一点的,但发生的事情是你实际上创建了一个名为[object Object]的集合。虽然有点牵强,但以下是您可以重现此情况的方法:
// create an object, let's call it y
> var y = {a : 1, b : 2, c : [1, 2, 3]}
// now create a collection using the variable as the name by inserting
> db[y].insert({s : 1})
// we now have [object Object] as a collection
> show collections
ObjectId("552b9e7d8c5b893bc6bfae45")
[object Object]
system.indexes
// This makes it a little more obvious what we have done
> db.getCollection( "system.namespaces" ).find();
{ "name" : "x.ObjectId(\"552b9e7d8c5b893bc6bfae45\")" }
{ "name" : "x.system.indexes" }
{ "name" : "x.ObjectId(\"552b9e7d8c5b893bc6bfae45\").$_id_" }
{ "name" : "x.[object Object]" }
{ "name" : "x.[object Object].$_id_" }
// We can even query it
> db[y].find()
{ "_id" : ObjectId("552b9f728c5b893bc6bfae47"), "s" : 1 }
// To make it even more obvious what is going on, let's use a different object
> var z = {a : 1, b : 2, c : [1, 2, 3, 4]}
> db[z].insert({t : 1})
// BUT, no new collection this time, we still just have one [object Object]
> db.getCollection( "system.namespaces" ).find();
{ "name" : "x.ObjectId(\"552b9e7d8c5b893bc6bfae45\")" }
{ "name" : "x.system.indexes" }
{ "name" : "x.ObjectId(\"552b9e7d8c5b893bc6bfae45\").$_id_" }
{ "name" : "x.[object Object]" }
{ "name" : "x.[object Object].$_id_" }
// let's confirm by querying
db[z].find()
{ "_id" : ObjectId("552b9f728c5b893bc6bfae47"), "s" : 1 }
{ "_id" : ObjectId("552ba1888c5b893bc6bfae48"), "t" : 1 }

因此,MongoDB允许使用对象创建集合,但是无论传入什么对象,所有对象都会评估为相同的 [object Object] 字符串。 这意味着您无法确定如何创建此集合,但好的一面是只需创建任何对象即可将其删除。 对于我的情况,我将重复使用上面的 z 变量,但实际上您可以使用任何对象来进行删除。
> db[z].drop()
true
> db.getCollection( "system.namespaces" ).find();
{ "name" : "x.ObjectId(\"552b9e7d8c5b893bc6bfae45\")" }
{ "name" : "x.system.indexes" }
{ "name" : "x.ObjectId(\"552b9e7d8c5b893bc6bfae45\").$_id_" }

现在它已经消失了。关于这是否是一个错误,你可以辩称[object Object]是一个有效的集合名称 - 我不建议使用它,但它并不违法。所以也许不是一个错误,但仍然可以提出改进建议。

此外,我测试了一下,你甚至不需要实际使用一个对象,在这里你可以使用字符串,像这样:

var j = '[object Object]'
db[j].drop()

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