Клиент Mongo не может получить доступ к коллекциям с префиксом подчеркивания
Я назвал коллекцию с подчеркиванием в Mongo и не могу получить к ней доступ из оболочки:
meteor:PRIMARY> show collections
_assignments
chatmessages
(... other stuff)
Попытка запуска любой функции в первой коллекции приводит к ошибке:
meteor:PRIMARY> db._assignments.find()
Thu Jun 19 10:53:28.450 TypeError: Cannot call method 'find' of undefined
Однако другие коллекции отлично работают:
meteor:PRIMARY> db.chatmessages.find()
{ "room" : "j5oau9DJ6GNpT9nR8", "userId" : "at9Kt8NNL4aeof6LE", "text" : "@nomad943 can you take a look at event #1?", "timestamp" : 1391806611977, "_id" : "26GbXa6c4B65FYRxC" }
{ "room" : "T7JfjBhri48bNHAfQ", "userId" : "B82LxmPBZWDnN4N2p", "text" : "Thinking #60 should be deleted, it a duplicate of #36 and the region is wrong for the province", "timestamp" : ISODate("2014-06-18T18:57:56.480Z"), "_id" : "29pKqPhi4hgxCb2Ky" }
Что здесь происходит?
Ответы
Ответ 1
Я не вижу, чтобы проблема, отличная от оболочки, не могла решить эту проблему с помощью синтаксиса хелпера по умолчанию. Вы все равно можете получить доступ к коллекциям, названным так в оболочке:
db.createCollection("_assignments")
{ "ok" : 1 }
db.getCollection("_assignments").find()
db.getCollection("_assignments").insert({ "a": 1 })
WriteResult({ "nInserted" : 1 })
db.getCollection("_assignments").find({ "a": 1 })
{ "_id" : ObjectId("53a36a4047234c4e9bb4feac"), "a" : 1 }
Ответ 2
Это известная ошибка. Не префикс коллекции с подчеркиваниями.
https://jira.mongodb.org/browse/SERVER-445
Ответ 3
Вы можете переименовать его, переключившись на базу данных admin в mongodb:
use admin
db.runCommand({renameCollection:"destinationDatabaseName._assignments",
to:"destinationDatabaseName.assignments"})
а затем вы можете использовать его как обычно.
Ответ 4
Если ваше имя коллекции содержит символ подчеркивания и вы хотите вставить новый документ, вам необходимо назначить коллекцию переменной и использовать ее для вставки, как показано ниже:
var assignments = db.getCollection("_assignments")
assignments.insertOne(
{
room : "123",
userId : "1",
text : "text"
}
)
после документации.
Ответ 5
Когда имя коллекции начинается с подчеркивания, оно должно быть заключено в двойные кавычки. Оказывается, что (по крайней мере в MongoDB версии 4.x или ниже) подчеркивание (_ в качестве первого символа) не интерпретируется правильно, следовательно, вы должны заключить его в кавычки (т.е. указать как простую строку), например, следующее не работает :
db._someCollection.find()
но хорошо работает следующее:
db.getCollection("_someCollection").find();
НТН