MongoDB 和 C# - 检查文档是否存在,如果不插入它

MongoDB and C# - Checking if document exists, if it doesn't insert it

我目前从 Yelp Fusion API 获得了 50 家餐厅的列表。我想将这些餐厅保存在我的数据库中,以便在我的应用程序中进一步使用。

由于我根据用户的坐标获得此列表,因此 API 可能会 return 已经在我的数据库中的餐馆。为防止重复,我检查 yelp 提供的餐厅 ID 是否已存在于数据库中。如果它已经在我的数据库中,则不会插入该餐厅。

我正在使用 MongoDB 数据库。

我使用以下函数完成此操作:

public async static void CheckSubjects(List<Subject> subjects)
    {
        SubjectRepository rep = new SubjectRepository();
        List<Subject> insert = new List<Subject>();
        foreach (var item in subjects)
        {
            if (!rep.SubjectsExists(item).GetAwaiter().GetResult())
                insert.Add(item);
        }
        if (insert.Count > 0)
            await rep.CreateAllSubjects(insert);
    }

在此函数中,主题是餐厅。存储库是与数据库通信的class。

这是我检查餐厅是否已经存在的函数:

public async Task<bool> SubjectExists(Subject sub)
    {
        var result = await db.Subjects.Find(Builders<Subject>.Filter.Eq("yelp_id", sub.yelp_id)).FirstOrDefaultAsync();
        if (result != null)
            return true;
        else
            return false;
    }

您可以看到对数据库进行 50 次调用以查看它是否已存在是非常耗性能的。我做了一些研究并从 MongoDB 中找到了 upsert 函数。我只是不知道如何在我的场景中使用它。

谁能帮我解决这个问题?提前致谢!

在更新期间使用 upsert 作为选项时,如果文档不存在,则会创建该文档。您可以调用 update for each of them with upsert set as true (I think it'd be something like this)

而不是试图找到每个餐厅然后插入它们

另一种可能更有效的方法是通过创建 unique indexyelp_id 设置为键,然后在插入重复条目时它会失败,因此您无需担心如果它已经在数据库中。