MongoDB |Как мне слить с существующим значением? - PullRequest
0 голосов
/ 15 октября 2018

БД выглядит следующим образом.


коллекции: Комментарий

{
    "_id" : ObjectId("5bc4348f8e798ccb030991e8")
    "comment_no" : 143,
    “comment_content” : “test test”
}


коллекции: Сообщение

{
    "_id" : ObjectId("5bc16b068e798ccb03096efa"),
    "post_no" : 48,
    "comment" : [ 
        {
            "comment_no" : 143,
            "comment_group" : 1 // This value will disappear.
        }
    ]
}


Запрос выглядит следующим образом:

db.getCollection('post').aggregate([
{
    $match : {post_no: 48}
    },
    {
        $lookup: {
            from: 'comment'
            localField: 'comment.comment_no',
            foreignField: 'comment_no',
            as: 'comment'
        }
    }
])


Результаты следующие.

{
    "_id" : ObjectId("5bc16b068e798ccb03096efa"),
    "post_no" : 48,
    "comment" : [ 
        {
            "comment_no" : 143,
            “comment_content” : “test test”
        }
    ]
}


Существующие данные исчезают, но я хочу объединить значение comment_group.

Например, желаемый результат: ..

{
    "_id" : ObjectId("5bc16b068e798ccb03096efa"),
    "post_no" : 48,
    "comment" : [ 
        {
            "comment_no" : 143,
            “comment_content” : “test test”,
            "comment_group" : 1 // Here!! I want to use this value.
        }
    ]
}

Могу ли я сделать запрос, чтобы значения были объединены в comment_no?

Ответы [ 2 ]

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

Вы можете получить то, что вы хотите, как это:

db.post.aggregate([
{
    $match : { post_no: 48 }
}, {
    $unwind: '$comment' // flatten 'comment' array into sub-documents
}, {
    $lookup: {
        from: 'comment',
        let: {
            'comment': '$comment', // keep a reference to the 'comment' sub-document
        },
        pipeline: [{
            $match: { $expr: { $eq: [ '$comment_no', '$$comment.comment_no' ] } } // perform the join
        }, {
            $replaceRoot: { "newRoot": { $mergeObjects: [ '$$comment', '$$ROOT' ] } } // merge the found object with the original content of 'comment'
        }],
        as: 'comment'
    }
}, {
    $group: { // restore the original structure
        _id: '$_id',
        'comment': { $push: { $arrayElemAt: [ '$comment', 0 ] }  }
    }
}])
0 голосов
/ 15 октября 2018

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

Вам нужно сначала $unwind массив comment, чтобы соответствовать точному comment_no, а затем $group для возврата к исходному виду

db.getCollection("post").aggregate([
  { "$match": { "post_no": 48 }},
  { "$unwind": "$comment" },
  { "$lookup": {
    "from": "comment"
    "localField": "comment.comment_no",
    "foreignField": "comment_no",
    "as": "comment.comment_content"
  }},
  { "$unwind": "$comment.comment_content" },
  { "$addFields": {
    "comment": {
      "$mergeObjects": ["$comment", "$comment.comment_content"]
    }
  }},
  { "$group": {
    "_id": "$_id",
    "comment": { "$push": "$comment" }
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...