如何将 bsonarray 的 {[“name”: “myname”, “value”:“”myvalue“ ]} 键值对转换为常规 {”myname“: ”myvalue“}

How to turn a bsonarray's {["name": "myname", "value":""myvalue" ]} key-value pair into a regular {"myname": "myvalue"}

提问人:Syni 提问时间:11/14/2023 最后编辑:Syni 更新时间:11/15/2023 访问量:40

问:

环境:Asp.net Core MVC。

我有一个实体类,用于使用以下获取代码从Mongodb获取数据:

public ActionResult GetUserOrderList(int page, int pageSize, string userId)
{
    string url = Universal.Universal.GetConfiguration("MongoDbConnection");
    var client = new MongoClient(url);
    IMongoDatabase database = client.GetDatabase("MyMongoDb");
    IMongoCollection<UserOrderList> collection = database.GetCollection<UserOrderList>("orders");

    var filter = Builders<UserOrderList>.Filter.Eq(o => o.UserId, userId);
    var projection = Builders<UserOrderList>.Projection
        .Exclude("_id") 
        .Include(o => o.UserId)
        .Include(o => o.OrderNo)
        .Include(o => o.StatusText)
        .Include(o => o.CreateTime)
        .Include(o => o.GoodsList)
        .Include(o => o.FinalPrice);

    int skip = (page - 1) * pageSize;
    List<UserOrderList> orders = collection
        .Find(filter)
        .SortByDescending(o => o.CreateTime) 
        .Skip(skip)
        .Limit(pageSize)
        .Project<UserOrderList>(projection)
        .ToList();
    return Ok(orders);
}

实体类如下:

public class UserOrderList
{
    public string UserId { get; set; }
    public string OrderNo { get; set; }
    public string StatusText { get; set; }
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime CreateTime { get; set; }
    public string FinalPrice { get; set; }
    public BsonArray GoodsList { get; set; }
}

现在的问题是:假设我的数据库中有这条数据:

{
  "_id": {
    "$oid": "65530e198e6e5d2dffa09a55"
  },
  "UserId": "123",
  "DeskId": 18,
  "OrderNo": "123",
  "OriginalPrice": "123",
  "FinalPrice": "123",
  "CreateTime": {
    "$date": "2023-11-14T06:05:13.007Z"
  },
  "CompleteTime": null,
  "PayTime": {
    "$date": "2023-11-14T06:05:13.007Z"
  },
  "Status": 1,
  "StatusText": "Finished",
  "GoodsList": [
    {
      "name": "testName",
      "price": 32,
      "number": 1,
      "id": 68345,
      "cate_id": 6208,
      "image": "/testimg.png",
      "use_property": 1,
      "props_text": "standardtext,standardtext2",
      "props": [
        582,
        585
      ]
    }
  ],
  "Notes": "this.form.remark",
  "StoreId": null,
  "StoreName": null,
  "TypeCate": 1
}

我想如上所述阅读它,但实际上阅读后会:

[
  {
    "userId": "123",
    "orderNo": "123",
    "statusText": "Finished",
    "createTime": "2023-11-14T14:05:13.007+08:00",
    "finalPrice": "123",
    "goodsList": [
      [
        {
          "name": "name",
          "value": "testName"
        },
        {
          "name": "price",
          "value": 32
        },
        {
          "name": "number",
          "value": 1
        },
        {
          "name": "id",
          "value": 68345
        },
        {
          "name": "cate_id",
          "value": 6208
        },
        {
          "name": "image",
          "value": "/testimg.png"
        },
        {
          "name": "use_property",
          "value": 1
        },
        {
          "name": "props_text",
          "value": "standardtext,standardtext2"
        },
        {
          "name": "props",
          "value": [
            582,
            585
          ]
        }
      ]
    ]
  }
]

问题出在 GoodsList 上,它的构造符合 bson 的规律,但不符合 json 格式的需求。我需要直接返回键值对,而不是以名称+值的形式返回。

我尝试了多次转换,但没有一个有效。那么,有没有其他方法可以继续这个过程呢?实际数据在 mongodb compass 中看起来与我想要的结果相同。

我尝试在编写程序时添加转换:

public static BsonArray ConvertJArrayToBsonArray(JArray jArray)
{
    BsonArray bsonArray = new BsonArray();
    foreach (JObject item in jArray.Cast<JObject>())
    {
        BsonDocument bsonDocument = BsonDocument.Parse(item.ToString());
        bsonArray.Add(bsonDocument);
    }
    return bsonArray;
}

还尝试在获取数据后添加转换,但这不起作用:

public static BsonArray GetSimplifiedGoodsList(BsonArray goodsList)
{
    var newGoodsList = new BsonArray();

    foreach (var good in goodsList)
    {
        if (good.BsonType == BsonType.Document)
        {
            var newGood = new BsonDocument();
            var goodDocument = good.AsBsonDocument;

            foreach (var prop in goodDocument)
            {
                if (prop.Value.BsonType == BsonType.Array)
                {
                    var subArray = GetSimplifiedGoodsList(prop.Value.AsBsonArray);
                    newGood.Add(prop.Name, subArray);
                }
                else if (prop.Value.BsonType == BsonType.Document && prop.Value.AsBsonDocument.Contains("name") && prop.Value.AsBsonDocument.Contains("value"))
                {
                    var name = prop.Value["name"].AsString;
                    var value = prop.Value["value"];
                    newGood.Add(name, value);
                }
                else
                {
                    newGood.Add(prop.Name, prop.Value);
                }
            }
            newGoodsList.Add(newGood);
        }
        else
        {
            newGoodsList.Add(good);
        }
    }

由于我不知道该怎么做,所以这两个解决方案来自人工智能。

json mongodb asp.net-core-mvc bson

评论

0赞 dododo 11/14/2023
在第二种情况下,究竟什么不起作用?
0赞 Syni 11/15/2023
@dododo我想更改 { “name”: “testName”, “value”: “testName” }, .此代码无法将此查询的结果转换为键值对,例如 “name”: “testName”。

答: 暂无答案