При использовании Mongolite для вставки записи в коллекцию, как вы возвращаете ObjectID? - PullRequest
0 голосов
/ 01 марта 2019

Я работаю над небольшим проектом, в котором в базе данных Mongo есть несколько коллекций, которые имеют отношения один ко многим с другими коллекциями.

Допустим, у меня есть коллекция с именем Company, которая имеет отношение 1 ко многим с Employee.В R, если я только что создал экземпляр компании и сделал что-то вроде returnValue <- companyCollection$insert(Company), я хотел бы получить возвращаемое значение, которое указывает, что представляет собой objectId недавно добавленной компании.Я хочу этого, потому что я планирую создать Employee экземпляров, которые имеют поле с именем companyId, которое будет иметь поле objectId этой компании в качестве поля.Есть ли способ получить objectId, возвращаемый при вставке 1 записи в коллекцию с использованием монголита?

Я знаю, что если вы работаете напрямую с mongo, вы можете использовать db.collection.insertOne() для получения идентификатора объекта, но я не вижу таких опций, используя оболочку mongolite для R.

Если это невозможноВ mongolite, как вы определяете атрибут '_id' таким образом, чтобы при вставке записи в коллекцию mongo рассматривал его как тип "ObjectID", а не "String"?В настоящее время, если я предоставляю свой собственный _id, mongo рассматривает _id как строку, а не как идентификатор объекта.Монго компас показывает мой вставленный идентификатор документа как:

mongo treats supplied _id as

вместо этого:

The _id generated by mongo, which is actually of type

1 Ответ

0 голосов
/ 05 марта 2019

Мне не удалось найти способ получения сгенерированного идентификатора объекта при вставке документа в коллекцию, но в итоге я использовал для этого обходной путь.Обходной путь заключается в том, чтобы в вашем документе было временное поле с 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...