Подтвердить что ты не робот

Клиент 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" }

Что здесь происходит?

4b9b3361

Ответ 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 }

Ответ 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();

НТН