Объединить родительское поле и его вложенное поле массива в mongodb

#c# #mongodb #aggregation-framework #mongodb-.net-driver

#c# #mongodb #агрегация-фреймворк #mongodb-.net-driver

Вопрос:

У меня есть коллекция, подобная приведенной ниже

 {
    "id":"5fd13c33ac0277c435117519",
    "content":"test",
    "votes":[
        {
            "user":"22",
            "isLike":true
        },
        {
            "user":"25",
            "isLike":false
        },
        {
            "user":"43",
            "isLike":false
        }
    ]
},
{
    "id":"5fd13c33ac0277c435237443",
    "content":"test 2",
    "votes":[
        {
            "user":"25",
            "isLike":true
        },
        {
            "user":"43",
            "isLike":false
        }
    ]
}
 

Как я могу получить приведенный ниже результат с помощью драйвера c #, запросив votes.user -ie. 25- а затем объединить эти 2 поля из родительского и вложенного массива?

 {
    "id":"5fd13c33ac0277c435117519",
    "isLike":false
},
{
    "id":"5fd13c33ac0277c435237443",
    "isLike":true
}
 

РЕДАКТИРОВАТЬ: я получил результат после некоторой попытки и сбоя при mongoplayground.net , все еще не уверен, как преобразовать его через драйвер c #.

 db.collection.aggregate([
  {
    $unwind: "$votes"
  },
  {
    $match: {
      "votes.user": "25"
    }
  },
  {
    $replaceWith: {
      id: "$id",
      isLike: "$votes.isLike"
    }
  }
])
 

Ответ №1:

Я справился с этим, как показано ниже, и хотел поделиться, если кому-то это понадобится в будущем.

Я лично решил пойти по пути «один ко многим» с раздельным сбором голосов после некоторых чтений.

 var match = new BsonDocument("votes.user", 25);

var replace = new BsonDocument(new List<BsonElement> {
    new BsonElement("id", "$id"),
    new BsonElement("isLike", "$votes.isLike"),
});

return await _collection.Aggregate()
    .Unwind(c => c.votes)
    .Match(match)
    .ReplaceWith<UserVote>(replace)
    .ToListAsync();