MongoDB-在单个集合中插入多种类型的对象

时间:2019-04-17 06:45:10

标签: c# mongodb asp.net-core

我有不同类的对象,想将它们存储在MongoDB中的单个集合中。

我正在将asp.net core 2.2与MongoDB.Driver 2.8.0和MongoDB 4.0.5一起使用。 我做了一些尝试。

这个想法:我可以将所有下面的对象存储在一个集合中。目前,我可以保存它们,但无法阅读->获取 Set dbs = CurrentDb Set rst = dbs.OpenRecordset("_Sun00Q") strName = rst.Fields("PLNames") strSetName = rst.Fields("SetName") Set rst2 = dbs.OpenRecordset(strName & "_trackList_RndOrd") intPLNid = rst2.Fields("PLNid") intId = rst2.Fields("id") SQL = "UPDATE " & strSetName & " SET id=" & intId & " WHERE PLNid=" & intPLNid DoCmd.RunSQL SQL ,但仅在重新运行应用程序之后。在空数据库上,我可以保存对象并检索它们。当我关闭应用程序并且不删除数据库时,在"FormatException: Element '_id' does not match any field or property of class Mongo2.Models.MongoEntity."

上出现异常

我想我缺少一些步骤,或者我的方法无效-在互联网上找不到任何可行的示例。

任何帮助将不胜感激。通过共享指向有效解决方案/示例的链接,或在此处。

型号:

collection.Find(book => true).ToList();
        }

数据上下文:

public class MongoEntity
{
}

[BsonIgnoreExtraElements]
public class BookLibrary : MongoEntity
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string BookLibraryId { get; set; }
    public List<Book> Library { get; set; }
}

[BsonIgnoreExtraElements]
public class Book : MongoEntity
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string BookId { get; set; }

    [BsonElement("Name")]
    public string BookName { get; set; }

    [BsonElement("Price")]
    public decimal Price { get; set; }

    [BsonElement("Category")]
    public Category Category { get; set; }

    [BsonElement("Author")]
    public Author Author { get; set; }

    [BsonElement("Date")]
    public DateTime Added { get; set; }
}

[BsonIgnoreExtraElements]
public class Author : MongoEntity
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string AuthorId { get; set; }
    [BsonElement("Author name")]
    public string Name { get; set; }
    [BsonElement("Author last name")]
    public string LastName { get; set; }
}

[BsonIgnoreExtraElements]
public class Category : MongoEntity
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string CategoryId { get; set; }
    [BsonElement("Category name")]
    public string CategoryName { get; set; }
}

2 个答案:

答案 0 :(得分:1)

问题出在Id字段。您已将其自定义,但是MongoDB始终将ID属性存储为_id到数据库中,并且无法更改。尝试使用BsonElementAttribute更改名称将被忽略。

要解决您的问题,您可以尝试以下操作:

  1. 使用CategoryIdBsonElement(以及其他id字段)上添加属性,但是我不确定是否可以使用。
  2. CategoryId更改为Id(以及其他id字段)

答案 1 :(得分:0)

答案非常简单明了,但我却以某种方式错过了。

对象的类型与集合名称没有密切关系,所以我可以使用:

var books = _database.GetCollection<Books>("Books");
var bookLibraries = _database.GetCollection<BookLibrary>("Books");
var authors = _database.GetCollection<Author>("Books");
var categories = _database.GetCollection<Category>("Books");

另一种解决方案是使用BsonDocument类型:

var books = _database.GetCollection<BsonDocument>("Books");

就是这样。