提问人:Syni 提问时间:11/14/2023 最后编辑:Syni 更新时间:11/15/2023 访问量:40
如何将 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"}
问:
环境: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);
}
}
由于我不知道该怎么做,所以这两个解决方案来自人工智能。
答: 暂无答案
评论