У меня есть коллекция, как показано ниже
{
"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
}
]
}
Как я могу получить приведенный ниже результат с помощью драйвера С#, запросив голосование.пользователь -т.е. 25-, а затем объединить эти 2 поля из родительского и вложенного массива?
{
"id":"5fd13c33ac0277c435117519",
"isLike":false
},
{
"id":"5fd13c33ac0277c435237443",
"isLike":true
}
Обновлено: у меня есть результат после неудачной попытки на mongoplayground.net, но я все еще не уверен, как преобразовать его через драйвер С#.
db.collection.aggregate([
{
$unwind: "$votes"
},
{
$match: {
"votes.user": "25"
}
},
{
$replaceWith: {
id: "$id",
isLike: "$votes.isLike"
}
}
])
Мне удалось это, как показано ниже, и я хотел поделиться, если кому-то это понадобится в будущем.
Я лично решил пойти по пути «один ко многим» с раздельным сбором голосов после некоторых чтений.
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();