我在一个小项目中,Mongo数据库中有一些集合,这些集合与其他集合具有一对多的关系。
假设我有一个名为Company
的集合,该集合与Employee
有一对多的关系。在R中,如果我刚刚创建了一个公司实例,并且做了类似returnValue <- companyCollection$insert(Company)
的操作,那么我想获得一个返回值,该值指示新插入的公司的objectId
是什么。我想要这样做是因为我计划创建Employee
实例,这些实例具有一个名为companyId
的字段,该字段将具有该公司的objectId
作为一个领域。使用mongolite将1项插入到集合中时,是否有任何方法可以获取返回的objectId
?
我知道是否可以直接与mongo一起使用,您可以使用db.collection.insertOne()
来获取对象ID,但是我看不到将mongolite包装用于R的情况。
如果mongolite无法做到这一点,那么如何指定'_id'属性,以便将条目插入到集合中时mongo将其视为“ ObjectID”而不是“ String”类型?当前,如果我提供自己的_id,mongo会将_id视为字符串而不是对象ID。 Mongo罗盘将我插入的文档ID显示为:
而不是这个:
答案 0 :(得分:0)
在将文档插入集合中时,我无法找到一种方法来获取生成的对象ID,但是最终我只是使用了一种变通方法。解决方法是在您的文档中有一个临时字段并为其添加一个UUID,然后使用该uuid再次查找该对象。之后,您可以获取mongo生成的_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)
}