2015-04-13 6 views
3

У меня есть MongoDB с некоторыми коллекциями. При наборе show collections по моим фактическим коллекциям я вижу таинственную коллекцию [object Object]. Я не могу использовать или удалить его, потому что в нем есть плохие символы. Может кто-нибудь объяснить, что могло вызвать появление этой «коллекции» и как ее удалить?Удалить коллекцию STRANGE в Mongo


Update:

db.getCollectionNames() возвращает тот же результат:

[ "[object Object]", "my_collection", "system.indexes", "my_collection1" ]

Update2:

db.getCollection("[object Object]").drop() работал. Причина такой ошибки до сих пор неизвестна

+0

возможно дубликат [Невозможно удалить коллекцию из MongoDB] (http://stackoverflow.com/questions/13661801/can-not-delete-collection-from-mongodb). Насколько он может казаться, я действительно не знаю. –

+0

... тот факт, что такая коллекция существует, звучит как ошибка. Является ли вывод 'db.getCollectionNames()' другим? – mnemosyn

+0

Под этой БД показана эта коллекция? –

ответ

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() 
Смежные вопросы