在 C# 中从序列化为 JSON 的 mongodb 文档中删除 ObjectId

Posted

技术标签:

【中文标题】在 C# 中从序列化为 JSON 的 mongodb 文档中删除 ObjectId【英文标题】:Remove ObjectId from mongodb document serialized to JSON in C# 【发布时间】:2020-06-01 11:54:56 【问题描述】:

我在这里遇到了一些问题。我正在使用此功能从 mongodb 集合中获取我的所有产品:

public async Task<string> getAllProducts()
        
            List<string> all = new List<string>();

            var document = await getCollection("produits").Find(new BsonDocument()).ToCursorAsync();
            foreach (var doc in document.ToEnumerable())
            
                var res = doc.ToJson();
                all.Add(res);
            
            return JsonConvert.SerializeObject(all);
        

它会向我的反应前端返回一个看起来像这样的 JSON。

 "_id" : ObjectId("5e49bdf5f040e808847a17d7"), 
"email" : "example@gmail.com", 
"quantite" : 1, 
"matricule" : 1

问题是我无法在我的 javascript 中解析这个,因为:ObjectId("5e49bdf5f040e808847a17d7")

当然,我可以在解析它之前做一些字符串魔术,但我宁愿在服务器端更正它。那么有没有办法可以摆脱这个问题并得到这样的结果?

 "_id" : "5e49bdf5f040e808847a17d7", 
    "email" : "example@gmail.com", 
    "quantite" : 1, 
    "matricule" : 1

【问题讨论】:

【参考方案1】:

试试这个。它将序列化字符串 id 而没有 objectid 的东西。

    public static async Task<string> getAllProducts()
    
        var collection = db.GetCollection<object>("produits");

        var all = new List<object>();

        using (var cursor = await collection.FindAsync(""))
        
            while (await cursor.MoveNextAsync())
            
                foreach (var doc in cursor.Current.ToArray())
                
                    all.Add(doc);
                
            
        

        return Newtonsoft.Json.JsonConvert.SerializeObject(all);
    

【讨论】:

你去!是的,解决了这个问题,非常感谢。 但它确实有一个小问题,每个键都在自己的 json 中,而不是一个包含所有键的 json,但谢天谢地,有一个解决方法。【参考方案2】:

通过为 mongodb 对象创建一个类来修复。

public class Product

    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id  get; set; 
    public int matricule  get; set; 
    public int quantite  get; set; 
    public string email  get; set; 
    public float prix  get; set; 
    public string image  get; set; 

获取它们并使用 BsonSerializer 反序列化:

public async Task<List<Product>> getAllProducts()
    var collection = await getCollection("produits").Find(new BsonDocument()).ToListAsync();
    List<Product> all = new List<Product>();
    foreach(var doc in collection)
        all.Add(BsonSerializer.Deserialize<Product>(doc));
    
    return all;

应要求退回:

[HttpGet]
public async Task<string> ShowProductsAsync()

    MongodbModel model = new MongodbModel();
    var products = await model.getAllProducts();
    Console.WriteLine(products);
    return JsonConvert.SerializeObject(products);

【讨论】:

【参考方案3】:
string GetAllProduits()
    var collection = database.GetCollection<BsonDocument>("produits");
    var project = Builders<BsonDocument>.Projection.Exclude("_id");
    var filter = Builders<BsonDocument>.Filter.Empty;
    var rlt=collection.Find(filter).Project(project);
    return rlt.ToList().ToJson();

【讨论】:

如果你能解释一下你在这段代码中做了什么,那就太好了。

以上是关于在 C# 中从序列化为 JSON 的 mongodb 文档中删除 ObjectId的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中序列化为 JSON 并在 TS 中反序列化

在 C# 中将 JSON 数组反序列化为对象

如何在 C# 中将 JSON 数据序列化为 XML

将 JSON 字符串反序列化为多个 C# 对象

将json键值反序列化为字典c#

将 JSON 反序列化为 C# 类,其中 JSON 中的属性名称是动态的