簡體   English   中英

MongoDB-在單個集合中插入多種類型的對象

[英]MongoDB - insert multiple types of objects in single a collection

我有不同類的對象,並希望將它們存儲在MongoDB中的單個集合中。

我正在將ASP.NET Core 2.2與MongoDB.Driver 2.8.0和MongoDB 4.0.5一起使用。 我做了一些嘗試。

這個想法:我可以將所有下面的對象存儲在一個集合中。 目前,我可以保存它們,但無法閱讀它們->獲取"FormatException: Element '_id' does not match any field or property of class Mongo2.Models.MongoEntity." 但僅在重新運行應用程序之后。 在空數據庫上,我可以保存對象並檢索它們。 當我關閉應用程序並且不刪除數據庫時,在collection.Find(book => true).ToList(); }異常 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; }
}

數據上下文:

public class BookContext
{
    private readonly IMongoDatabase _database;
    private readonly IMongoClient _client;

    public BookContext(IConfiguration configuration)
    {
        _client = new MongoClient(configuration.GetSection(nameof(MongoDbSettings)).Get<MongoDbSettings>().ConnectionString);
        _database = _client.GetDatabase(configuration.GetSection(nameof(MongoDbSettings)).Get<MongoDbSettings>().DatabaseName);

    }

    public List<MongoEntity> Get()
    {
        var collection = _database.GetCollection<MongoEntity>("Books");
        return collection.Find(book => true).ToList();
    }

    public void AddBsonDocument()
    {
        var author = new Author()
        {
            Name = "Name",
            LastName = "Lastname",
            AuthorId = ObjectId.GenerateNewId().ToString()
        };

        var category = new Category()
        {
            CategoryId = ObjectId.GenerateNewId().ToString(),
            CategoryName = "Non-fiction"
        };

        var book = new Book()
        {
            BookName = "Random title",
            Category = category,
            Price = 54.93m,
            Added = DateTime.Now,
            BookId = ObjectId.GenerateNewId().ToString(),
            Author = author
        };

        var lib = new BookLibrary(){BookLibraryId = ObjectId.GenerateNewId().ToString(), Library = new List<Book>()};
        lib.Library.Add(book);



        var collection = _database.GetCollection<MongoEntity>("Books");

        var list = new List<MongoEntity> {lib, book, author, category};

        collection.InsertMany(list);

    }
}

問題出在Id字段。 您將其自定義,但是MongoDB始終將ID屬性存儲為_id並存儲在數據庫中,並且無法更改。 使用BsonElementAttribute嘗試更改名稱將被忽略。

要解決您的問題,您可以嘗試以下操作:

  1. 使用BsonElementCategoryId (以及其他ids字段)上添加屬性,但是我不確定它是否有效。
  2. CategoryId更改為Id (以及其他ID字段)

答案非常簡單明了,但我卻以某種方式錯過了答案。

對象的類型與集合名稱沒有密切關系,因此我可以使用:

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");

就這樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM