При использовании 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)
}
Другие вопросы по тегам