$ lookup с той же коллекцией - PullRequest
       33

$ lookup с той же коллекцией

0 голосов
/ 06 октября 2018

Я новичок в MongoDB, поэтому не уверен, правильно ли я сформулировал свой вопрос.

У меня есть коллекция, в которой данные выглядят так:

{ 
    "_id" : ObjectId("66666"), 
    "Id" : 994, 
    "PostType" : 1, 
    "AnswerId" : 334, 
    "CreationDate" : ISODate("1994-09-05T09:34:36.177+0000"), 
    "Tags" : "test", 
    "Parent" : null, 
}

{ 
    "_id" : ObjectId("8888"), 
    "Id" : 334, 
    "PostTypeId" : 2, 
    "AnswerId" : NaN, 
    "CreationDate" : ISODate("20005-08-03T11:29:42.880+0000"), 
    "ParentId" : 994
}

Оба документа находятся в одной коллекции, я пытаюсь использовать AnswerId из документа с PostType: 1 и используюэто значение в качестве основного идентификатора для извлечения его CreationDate.

Вот логика, которую я пытаюсь реализовать, но, похоже, она не работает:

db.collection.aggregate([
    {$project:{_id:"$Id", Title:"$Title", Answerid:"$AnswerId", QuestionDate:"$CreationDate"}},
    {$match:{Id:"$Answerid"}},
    {$project:{AnswerDate:"$CreationDate"}}
])

Я открыт для любых предложений.

1 Ответ

0 голосов
/ 06 октября 2018

Вы можете попробовать ниже агрегации в mongodb 3.6 и выше

db.collection.aggregate([
  { "$match": { "Id": 2627 }},
  { "$lookup": {
    "from": "collection",
    "let": { "answerId": "$AnswerId" },
    "pipeline": [{ "$match": { "$expr": { "$eq": ["$Id", "$$answerId"] }}}],
    "as": "dates"
  }}
])

Или с 3.4 и выше

db.collection.aggregate([
  { "$match": { "Id": 2627 }},
  { "$lookup": {
    "from": "collection",
    "localField": "AnswerId",
    "foreignField": "Id",
    "as": "dates"
  }}
])
...