【问题标题】:How to fetch collection of subdocument using mongodb C# driver?如何使用 mongodb C# 驱动程序获取子文档的集合?
【发布时间】:2021-01-14 06:35:41
【问题描述】:

我有以下 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": ""
    }
  ]
}

我想使用 MongoDB C# 驱动程序将所有 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": ""
    }
  ]

我曾尝试使用组聚合函数,但它返回了一个数组数组。

我收到的结果:

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;
            }

有没有办法通过合并它们来获取子文档是一个数组。

【问题讨论】:

    标签: c# mongodb mongodb-query aggregation-framework mongodb-.net-driver


    【解决方案1】:

    你必须在$group之前$unwind

    • $unwind解构PostMedia数组
    • $replaceRootPostMedia 对象替换为根
    • $unset 删除 _id 字段
      { $unwind: "$PostMedia" },
      {
        $group: {
          _id: null,
          PostMedia: { $push: "$PostMedia" }
        }
      },
      { $unset: "_id" } // remove field
    

    Playground

    C#:

    new BsonArray
    {
        new BsonDocument("$unwind", "$PostMedia"),
        new BsonDocument("$group", 
        new BsonDocument
            {
                { "_id", BsonNull.Value }, 
                { "PostMedia", 
        new BsonDocument("$push", "$PostMedia") }
            })
        new BsonDocument("$unset", "_id")
    }
    

    【讨论】:

    • 有没有办法忽略_id
    • 需要在$group stage后添加$unsetstage,{ $unset: "_id" }
    • { $replaceRoot: { newRoot: "$PostMedia" } } 向我抛出错误这里有什么问题你能指导我吗
    • 什么是错误,在哪里抛出错误?。我不知道 c# 错误是否来自 c#,但会尝试。
    • 你能通过这个sn-p吗mongoplayground.net/p/w_hoDgvWmcq
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多