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

4
我目前从Yelp Fusion API获取一个50个餐厅的列表。我想将这些餐厅保存在我的数据库中,以便在我的应用程序中进一步使用。
由于我根据用户的坐标获取此列表,因此API可能会返回已经存在于我的数据库中的餐厅。为了避免重复,我检查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);
    }

这个函数中,主题是一个餐厅。存储库是与数据库通信的类。

这是我的函数,用于检查餐厅是否已存在:

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函数。我只是不知道如何在我的场景中使用它。
有人能帮帮我吗?提前感谢!
1个回答

3

当使用upsert作为更新选项时,如果文档不存在,它将被创建。你可以调用每个餐厅的update并将upsert设置为true(我认为应该是类似于this),而不是尝试查找每个餐厅然后插入它们。

另一种更有效的方法是通过创建一个unique indexyelp_id设置为键,这样在插入重复条目时会失败,因此您不需要担心它是否已经存在于数据库中。


为每个餐厅调用一次upsert会影响性能吗? - user4189129
1
我认为现在的方法稍微好一点,因为你只需要循环一次。但是我认为第二种方法会更好。 - andresk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接