如何根据 id 加载多个文档?

Posted

技术标签:

【中文标题】如何根据 id 加载多个文档?【英文标题】:How to load multiple documents based on ids? 【发布时间】:2021-11-20 04:40:31 【问题描述】:

我正在尝试将一组 id 从 C# 中的 mongodb 加载到列表中。任何人都可以帮助建议任何 mongodb 的收集或过滤方法吗?我对此很陌生

【问题讨论】:

请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

假设你有一个类似这样的模型:

public class MyModel

    [BsonId]
    public ObjectId Id get;set;

你可以使用In:

List<ObjectId> documentsToLoad = getDocumentsToLoad();

List<MyModel> documents = await myCollection
    .Find(
        Builders<MyModel>.Filter.In(m => m.Id, documentsToLoad)
    )
    .ToListAsync();

或者,如果您只是获取“原始” BsonDocument 对象,您可以编写:

List<BsonDocument> documents = await myCollection
    .Find(
        Builders<BsonDocment>.Filter.In("_id", documentsToLoad)
    )
    .ToListAsync();

【讨论】:

我认为你的答案会比上面的亚历山德拉更有效?我觉得你的答案会更快,因为它使用 Mongo 的 Filter.In 语法而不是标准的 C# .Contains @walnut_salami 我在这里不是 100% 确定的,但我认为它们可能被翻译成有效的相同的东西。不过,我不确定进行这种转换的效率。【参考方案2】:

除了@Llama的回答,你也可以使用Expression达到同样的效果。

var documentIds = GetDocumentIds();
var documents = await mongoContext
    .GetCollection<MyModel>("collectionName")
    .Find(model => documentIds.Contains(model.Id))
    .ToListAsync();

您还可以使用来自MongoDB.Driver.Linq 命名空间的Linq 扩展。

var documents = await mongoContext
    .GetCollection<MyModel>("collectionName")
    .AsQueryable()
    .Where(model => documentIds.Contains(model.Id))
    .ToListAsync()

【讨论】:

以上是关于如何根据 id 加载多个文档?的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个页面加载两个或多个百度的 UEditor HTML 编辑器

等待加载多个 ExtJS 存储

如何在 Laravel 中为 ORM 急切加载添加多个键约束?

如何加载多个依赖的主干模型?

如何渴望对同一张表加载多个belongsTo关系?

如何加快从磁盘加载XML文档的速度?