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

时间:2016-10-06 11:01:34

标签: c# mongodb upsert

我目前从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 个答案:

答案 0 :(得分:3)

在更新期间使用upsert作为选项时,如果文档不存在,则会创建该文档。不是试图找到每个餐馆然后插入它们,你可以为每个餐馆调用update,并将upsert设置为true(我认为它类似于this

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