我有一个带收藏的MongoDB。当在我的实际收藏中输入show collections时,我看到了神秘的[object Object]收藏。我不能使用或删除它,因为它的名字有坏字符。
有人能解释一下是什么原因导致这个“收藏”出现,以及如何删除它吗?
更新:
db.getCollectionNames()返回相同的结果:
[ "[object Object]", "my_collection", "system.indexes", "my_collection1" ]
更新2:
db.getCollection("[object Object]").drop()有效。这种虫子的原因还不清楚

最佳答案

我不能确切地告诉你你是如何做到这一点的,但发生的事情是,你确实创建了一个名为[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_" }

你拿到了,它不见了。至于这是否是一个bug,您可以将参数设置为[object Object]是一个有效的集合名-我不建议使用它,但它不是非法的。所以也许不是一个bug,而是一个可以建议的改进。
顺便说一下,我测试过你甚至不需要在这里使用对象,你可以用字符串来完成,比如:
var j = '[object Object]'
db[j].drop()

关于mongodb - 删除Mongo中的STRANGE集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29602575/

10-10 14:12
查看更多