使用Mongolite将条目插入集合中时,如何获取ObjectID?

时间:2019-03-01 08:50:12

标签: r mongodb mongolite

我在一个小项目中,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显示为:

mongo treats supplied _id as "string" rather than "ObjectId"

而不是这个:

The _id generated by mongo, which is actually of type "ObjectId"

1 个答案:

答案 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)
}