#c# #mongodb #mongodb-query #aggregation-framework #mongodb-.net-driver
#c# #mongodb #mongodb-запрос #агрегация-фреймворк #mongodb-.net-driver
Вопрос:
У меня есть следующий документ MongoDB:
{
"_id": {
"$oid": "5fbfa0005c15aaf2eac69ba6"
},
"PostMedia": [
{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img1.jpg",
"Title": null,
"Description": ""
},
{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img2.jpg",
"Title": null,
"Description": ""
}
]
},
{
"_id": {
"$oid": "5fbfa0485c15aaf2eac69ba7"
},
"PostMedia": [
{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img3.jpg",
"Title": null,
"Description": ""
},
{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img4.jpg",
"Title": null,
"Description": ""
}
]
}
и я хочу получить все PostMedia
в один массив, используя драйвер MongoDB C #.
Вот ожидаемый результат:
[
{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img1.jpg",
"Title": null,
"Description": ""
},
{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img2.jpg",
"Title": null,
"Description": ""
}, {
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img3.jpg",
"Title": null,
"Description": ""
},
{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img4.jpg",
"Title": null,
"Description": ""
}
]
Я пытался использовать функцию агрегирования групп, но она вернула массив array.
Результат, который я получил:
PostMedia:[{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img1.jpg",
"Title": null,
"Description": ""
},
{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img2.jpg",
"Title": null,
"Description": ""
}],[
{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img3.jpg",
"Title": null,
"Description": ""
},
{
"FilePath": "http://localhost:8886/localhost44323/image/",
"Filename": "img4.jpg",
"Title": null,
"Description": ""
}
]
Код на C #, который я написал до сих пор, выглядит следующим образом:
var group = new[]
{
new BsonDocument("$group",
new BsonDocument
{
{ "_id", BsonNull.Value },
{ "PostMedia", new BsonDocument("$push", "$PostMedia") }
})
};
var result = collection.Aggregate<MediaList>(group).FirstOrDefault();
return list;
}
Есть ли какой-нибудь способ извлечь вложенный документ, объединив их в один массив?
Ответ №1:
Вы должны $unwind
были сделать это раньше $group
,
$unwind
деконструироватьPostMedia
массив$replaceRoot
заменитьPostMedia
объект на корневой$unset
удалить_id
поле
{ $unwind: "$PostMedia" },
{
$group: {
_id: null,
PostMedia: { $push: "$PostMedia" }
}
},
{ $unset: "_id" } // remove field
C#:
new BsonArray
{
new BsonDocument("$unwind", "$PostMedia"),
new BsonDocument("$group",
new BsonDocument
{
{ "_id", BsonNull.Value },
{ "PostMedia",
new BsonDocument("$push", "$PostMedia") }
})
new BsonDocument("$unset", "_id")
}
Комментарии:
1. Есть ли способ игнорировать _id
2. для этого требуется добавить
$unset
этап после $group stage,{ $unset: "_id" }
3.
{ $replaceRoot: { newRoot: "$PostMedia" } }
выдает мне ошибку, что здесь не так, можете ли вы подсказать мне4. в чем ошибка и где возникает ошибка?. я не знаю c #, если ошибка из c #, но попробую.
5. можете ли вы просмотреть этот фрагмент mongoplayground.net/p/w_hoDgvWmcq