Mongolite и агрегация с поиском $ по ObjectId vs character

Работая с mongolite v0.9.1 (R) и MongoDB v3.4, я хотел бы объединить две коллекции: первая - родительская, содержащая ObjectId, вторая - дочерние, содержащие строковое значение родительского ObjectId.

Это основной синтаксис:

conParent$aggregate('[
    { "$lookup":
        { "from":"Children", 
          "localField": "_id",
          "foreignField": "parent_id",
          "as": "children"
        }
    }
 ]')

$ lookup, похоже, принимает только имя поля, я пробовал это, создавая синтаксические ошибки:

           .../...
           "foreignField": "{'$oid':'parent_id'}"
           .../...

Как с этим справиться?

Другим способом я безуспешно пытался сохранить родительский ObjectId в дочерних элементах в формате ObjectId (я все еще получаю строку в MongoDB):

   result <- transform(
                computeFunction, 
                parent_id = sprintf('{"$oid":"%s"}',parent$"_id"))
   resultCon <- conout$insert(as.data.frame(result))

Можно ли сохранить идентификатор как ObjectId в монголите?

Примечание. Я выполняю массовые вставки, поэтому не могу справиться с манипуляциями со строками JSON.

Любая идея ?

Редактировать:

Вот пример коллекций, которые я использую:

Родительская коллекция:

{
    "_id" : ObjectId("586f7e8b837abeabb778d2fd"),
    "name" : "Root1",
    "date" : "2017-01-01",
    "value" : 1.0,
    "value1" : 10.0,
    "value2" : 100.0
},
{
    "_id" : ObjectId("586f7ea4837abeabb778d30a"),
    "name" : "Root1",
    "date" : "2017-01-02",
    "value" : 2.0,
    "value1" : 20.0,
    "value2" : 200.0
}

Коллекция Children:

{
    "_id" : ObjectId("586f7edf837abeabb778d319"),
    "name" : "Item1",
    "value" : 1.1,
    "date" : "2017-01-01",
    "parent_id" : "586f7e8b837abeabb778d2fd"
}
{
    "_id" : ObjectId("586f7efa837abeabb778d324"),
    "name" : "Item2",
    "value1" : 11.111111111,
    "value2" : 12.222222222,
    "date" : "2017-01-01",
    "parent_id" : "586f7e8b837abeabb778d2fd"
}
{
    "_id" : ObjectId("586f7f15837abeabb778d328"),
    "name" : "Item1",
    "value" : 2.2,
    "date" : "2017-01-02",
    "parent_id" : "586f7ea4837abeabb778d30a"
}
{
    "_id" : ObjectId("586f7f2b837abeabb778d32e"),
    "name" : "Item2",
    "value1" : 21.111111111,
    "value2" : 22.222222222,
    "date" : "2017-01-02",
    "parent_id" : "586f7ea4837abeabb778d30a"
}

person jeanjerome    schedule 06.01.2017    source источник


Ответы (2)


Не могли бы вы попробовать:

"foreignField": "_id" 

Начиная с примера веб-сайта mongo:

library(mongolite)
library(jsonlite)

a = '[{ "_id" : 1, "item" : 1, "price" : 12, "quantity" : 2 },
{ "_id" : 2, "item" : 2, "price" : 20, "quantity" : 1 },
{ "_id" : 3  }]'

b= '[{ "_id" : 1, "sku" : "abc", "description": "product 1", "instock" : 120 },
{ "_id" : 2, "sku" : "def", "description": "product 2", "instock" : 80 },
{ "_id" : 3, "sku" : "ijk", "description": "product 3", "instock" : 60 },
{ "_id" : 4, "sku" : "jkl", "description": "product 4", "instock" : 70 },
{ "_id" : 5, "sku": null, "description": "Incomplete" },
{ "_id" : 6 }]'

mongo_orders <- mongo(db = "mydb", collection = "orders")
mongo_orders$insert(fromJSON(a))

mongo_inventory <- mongo(db = "mydb", collection = "inventory")
mongo_inventory$insert(fromJSON(b))

df <- mongo_orders$aggregate('[
    {
      "$lookup":
        {
          "from": "inventory",
          "localField": "item",
          "foreignField": "_id",
          "as": "inventory_docs"
        }
   }
]')

str(df)

Он также работает, когда оба установлены на _id

"localField": "_id",
      "foreignField": "_id",
person tokiloutok    schedule 06.01.2017
comment
Этот пример веб-сайта монго слишком прост. В реальной жизни идентификаторы коллекций разные. И в моем случае родительский идентификатор упоминается в полях parent_id дочерних элементов. - person jeanjerome; 06.01.2017
comment
Не могли бы вы привести пример структуры вашего документа? - person tokiloutok; 06.01.2017

Что ж, я должен сказать, что это вообще невозможно!

Mongilite получает _id как символ и не содержит ObjectId реализации.

So...

person jeanjerome    schedule 07.01.2017