【问题标题】:Mongodb Update or insert in c#Mongodb 更新或插入 c#
【发布时间】:2019-01-21 17:52:11
【问题描述】:

我想更新或插入到 mongo 集合“成员”。在这个集合下,我有一个数组 MagazineSubscription。这里的杂志 Code 是独一无二的。请参考示例 JSON。

因此,如果需要使用 C# mongo 驱动程序更新或插入 mongo。

  1. 首先我需要检查此代码是否存在 2、如果存在则更新一个
  2. 如果不存在则插入。

有什么方法可以一步完成。就像它已经存在更新,否则插入。而不是命中两次。因为我的收藏很大。

{ 
    "_id" : ObjectId("5c44f7017en0893524d4e9b1"), 
    "Code" : "WH01", 
    "Name" : "Lara", 
    "LastName" : "John", 
    "DOB" : "12-10-2017", 
    "Gender" : "Male", 
    "Dependents" : [
        {
            "RelationShip" : "Son", 
            "Name" : "JOHN", 
            "DOB" : "01-01-1970", 
            "Gender" : "Male", 
            "Address" : "Paris", 
            "ContactNumber" : "+312233445666"
        }, 
        {
            "RelationShip" : "Wife", 
            "Name" : "Marry", 
            "DOB" : "01-01-1980", 
            "Gender" : "Female", 
            "Address" : "Paris", 
            "ContactNumber" : "+312233445666"
        }
    ]
    "Matrimony" : [
        {
            "Fee" : 1000.0, 
            "FromDate" : "01-01-2015", 
            "ToDate" : "01-01-2017", 
            "Status" : false
        }
    ], 
    "MagazineSubscription" : [
        {
            "MagazineCode" : "WSS", 
            "DateFrom" : "01-05-2018", 
            "DateTo" : "01-01-2020", 
            "PaidAmount" : 1000.0, 
            "ActualCost" : 1500.0, 
            "Status" : false, 
            "DeliveryStatus" : [
                {
                    "ReturnedDate" : "10-01-2019", 
                    "Comment" : "Returned because of invalid address"
                }, 
                {
                    "ReturnedDate" : "10-02-2019", 
                    "Comment" : "Returned because of invalid address"
                }
            ]
        }
    ]
}

【问题讨论】:

    标签: c# mongodb mongodb-query


    【解决方案1】:

    使用 mongodb 的更新操作与 upsert:true。 请参考这里:https://docs.mongodb.com/manual/reference/method/db.collection.update/

    这是页面中的示例:

     db.collection.update(
       <query>,
       <update>,
       {
         upsert: <boolean>, //you need this option
         multi: <boolean>,
         writeConcern: <document>,
         collation: <document>,
         arrayFilters: [ <filterdocument1>, ... ]
       }
    )
    

    根据您的需要,这里有一个类似的问题: Upserting in Mongo DB using official C# driver

    编辑 1

    步骤:

    1. 首先您需要编写一个过滤器来扫描文档是否存在。您可以检查任意数量的键(本质上是一个文档)。
    2. 使用您要更新的键(本质上是一个文档)编写更新部分。
    3. 将 upsert 设置为 true。

    Mongodb 将使用您的过滤器来搜索文档。如果找到,它将使用更新部分执行您提到的更新。

    如果文档不存在,则在更新部分使用过滤键+键创建一个新文档。

    希望这能让事情变得清晰,因为我从未使用过 C# mongo 驱动程序。所以我无法为您提供确切的语法。

    编辑 2

    我在这里提供@jeffsaracco 的解决方案:

    MongoCollection collection = db.GetCollection("matches");
    var query = new QueryDocument("recordId", recordId); //this is the filter
    
    var update = Update.Set("FirstName", "John").Set("LastName","Doe"); //these are the keys to be updated
    matchCollection.Update(query, update, UpdateFlags.Upsert, SafeMode.False);
    

    【讨论】:

    • 该链接包含我可以在 shell 中执行的查询。我想要的不是查询。我正在寻找可以通过使用 c# mongo 驱动程序在 c# 中实现的东西。
    • 这里我需要使用 BSODocument 来包含在过滤器中吗?我有点困惑。我们如何使用引用的链接。 ? MagazineSubscription.MagazineCode 是将项目添加到 MagazineSubscription 时的过滤条件。您能否从引用我的示例 JSON 的 C# 代码中更新示例代码。
    • 感谢您的解释。我可以在 shell 中做到这一点。我的问题是如何在 c# 中而不是通过 shell 来实现它。 EDIT2 中显示的示例只是一个级别,并且是非常简单的案例。我的情况是我需要更新杂志订阅。请参考我的 json 并更新您的 EDIT2。那么你可能会遇到我卡住的地方。
    • jacekstyrylski.github.io/2018/02/01/… 但是当我启用 IsUpsert=true 时。我得到位置错误。
    • 这是我得到的错误“位置运算符没有从查询中找到所需的匹配项。”
    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2021-10-26
    • 2017-03-07
    相关资源
    最近更新 更多