Как получить коллекцию вложенного документа с помощью драйвера mongodb C #?

#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