При использовании Mongolite для вставки записи в коллекцию, как вы возвращаете ObjectID?
Я работаю над небольшим проектом, в котором база данных Mongo имеет несколько коллекций, которые имеют отношения один ко многим с другими коллекциями.
Допустим, у меня есть коллекция под названием Company
который имеет отношение 1 ко многим с Employee
, В R, если я только что создал экземпляр компании, и я сделал что-то вроде returnValue <- companyCollection$insert(Company)
Я хотел бы получить возвращаемое значение, которое указывает, что objectId
из недавно вставленной компании есть. Я хочу этого, потому что я планирую создать Employee
экземпляры, которые имеют поле под названием companyId
что бы эта компания objectId
как поле. Есть ли способ получить objectId
возвращается при вставке 1 записи в коллекцию с использованием монголита?
Я знаю, если вы работаете напрямую с Монго, вы можете использовать db.collection.insertOne()
получить идентификатор объекта обратно, но я не вижу таких опций, используя монголитную оболочку для R.
Если это невозможно с mongolite, как вы задаете атрибут '_id' таким образом, что при вставке записи в коллекцию mongo обрабатывает его как тип "ObjectID", а не "String"? В настоящее время, если я предоставляю свой собственный _id, mongo рассматривает _id как строку, а не как идентификатор объекта. Монго компас показывает мой вставленный идентификатор документа как:
а не это:
0 ответов
Я не смог найти способ получить сгенерированный идентификатор объекта при вставке документа в коллекцию, но в итоге я использовал для этого обходной путь. Обходной путь заключается в том, чтобы в вашем документе было временное поле с UUID, а затем использовать этот uuid для повторного поиска объекта. После этого вы можете получить _id
этот монго сгенерировал и удалил временное поле, которое было создано. Вот функция, которая делает это.
# an example of a collection
myTableCollection<- mongo("myTable", url = "mongodb://localhost:27017/myDatabase")
# This is a function to insert a dataframe into mongo collection as a document,
# and get back the ObjectID that was generated by mongo
storeIntoCollection <- function(document, collection){
# so create a temporary ID to find the entry in the database again
temp <- UUIDgenerate()
document$creationID <- temp
# insert the DB Object
returnValue = collection$insert(document)
# query string to look up object using temp id
id_string <- paste('{"creationID" : "' , temp , '"}', sep="")
# Get mongo DB object just inserted
insertedDocument = collection$find(id_string, field = '{}')
# delete the temporary 'creationID' field
update_string <- paste('{ "$unset" : {"creationID": ""} }', sep="")
collection$update(id_string, update_string)
# turn '_id' to 'id'
colnames(document)[colnames(document)=="_id"] <- "id"
return(insertedDocument$id)
}