#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();