Это первый раз, когда у меня есть ядро ​​.net, а MongoDB обычно использует Entity Framework ORM. Я использую .net core 3 и драйвер MongoDB 2.11 для работы с базой данных.

Вот пример службы репозитория:

public class Repository<T> : IRepository<T> where T : IDocument
{
    private readonly IMongoCollection<T> _collection;

    public Repository(IDatabaseSettings settings)
    {
            var client = new MongoClient(settings.ConnectionString);
            var database = client.GetDatabase(settings.DatabaseName);
            _collection = database.GetCollection<T>(GetCollectionName(typeof(T)));
    }

    Task<T> FindOneAsync(Expression<Func<T, bool>> filterExpression){}
    Task<T> FindByIdAsync(string id){}
    Task InsertOneAsync(T document) {}
    Task InsertManyAsync(ICollection<T> documents){}
    Task ReplaceOneAsync(T document) {}
    Task DeleteOneAsync(Expression<Func<T, bool>> filterExpression){}
    Task DeleteByIdAsync(string id) {}
    Task DeleteManyAsync(Expression<Func<T, bool>> filterExpression){}
    
}

Как видите, это стандартное определение класса репозитория.

У меня вопрос: когда репозиторий работает с определенной коллекцией, вся ли коллекция загружается в локальную память?

Например, если я хочу найти конкретный документ в коллекции, тогда GetCollection в конструкторе извлекает коллекцию из базы данных и запускает все документы в коллекции локально?

Или он генерирует запрос и выполняет его в базе данных аналогично Entity Framework ORM?

3
Michael 22 Фев 2021 в 02:42

1 ответ

Лучший ответ

У меня вопрос: когда репозиторий работает с определенной коллекцией, вся ли коллекция загружается в локальную память?

Нет.

Достаточно просто «обработать» коллекцию. Он не получает никаких документов.

Например, если я хочу найти конкретный документ в коллекции, тогда GetCollection в конструкторе извлекает коллекцию из базы данных и запускает все документы в коллекции локально?

Ни .

Вам нужно будет использовать FindOne или FindById. Те выдадут запрос на получение документов (один, если на то пошло)

Кстати, вам также может понадобиться Find (таким образом, чтобы получить более одного документа)

Или он генерирует запрос и выполняет его в базе данных аналогично Entity Framework ORM?

GetCollection не генерирует запрос на получение чего-либо


Это кажется немного "авторитетным", поэтому вы можете просто открыть оболочку mongo и поиграть:

// just set up some data to collection dummy
> db.dummy.insert([{a:2},{a:1}])
// look for any document having field 'a' with value 1.
// only one doc returned, fair enough
> db.dummy.find({ a: 1 })
{ "_id" : ObjectId("60334ea3623e06e621f86a0b"), "a" : 1 }

// this is equivalent to
> db.getCollection('dummy').find({ a: 1 })
// without the find() you just get information on the collection, NO documents fetched
// imagine collection as an object, on which you can issue queries (find, findOne, remove, ...)
// but not necessarily query to touch documents: e.g ensureIndex, help, ...
// (just type <<tab>> to see available commands)
> db.getCollection('dummy')
dummy.dummy

В качестве примечания: getCollection позволяет назначать имена коллекций немного своеобразными именами, например

db._dummy.insert({ a: 1 }) // fails because of '_' char
uncaught exception: TypeError: db._dummy is undefined :
db.getCollection('_dummy').insert({ a: 1 })
WriteResult({ "nInserted" : 1 })
1
grodzi 22 Фев 2021 в 06:38