MongoDB - вставка нескольких типов объектов в одну коллекцию - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть объекты разных классов, и я хотел бы хранить их в одной коллекции в 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(); }

Я полагаю, что мне не хватает некоторых шагов, или мой подход недействителен - не удалось найти какие-либо работающие примеры через Интернет.

Любая помощь будет высоко ценится. Либо с помощью ссылок на рабочие решения / примеры, либо здесь.

Модель:

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

    }
}

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Проблема с полем Id.Вы сделали это по своему усмотрению, но MongoDB всегда будет хранить ваше свойство ID как _id внутри БД, и это нельзя изменить.Попытка изменить имя с помощью BsonElementAttribute будет просто проигнорирована.

Для решения вашей проблемы вы можете попробовать следующее:

  1. Добавить атрибут на CategoryId (и другие поля идентификаторов тоже)с BsonElement, но я не уверен, работает ли он.
  2. Измените CategoryId на Id (и другие поля идентификаторов тоже)
0 голосов
/ 25 апреля 2019

Ответ оказался супер простым и очевидным, но почему-то я его пропустил.

Тип объекта не сильно связан с именем коллекции, поэтому я мог бы пойти с:

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

Просто так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...