【问题标题】:mongodb update with many embedd document带有许多嵌入式文档的 mongodb 更新
【发布时间】:2013-08-13 05:50:04
【问题描述】:

各位,我用的是mongodb官方的CSharp Driver,我得到了这两个类:

public class A
{
    public A()
    {
        Bs = new List<B>();
    }

    [BsonId]
    public string Id { get; set; }
    public string Name { get; set; }
    public IList<B> Bs { get; set; }
}

public class B
{
    public string Name { get; set; }
}

在db中,B嵌入在A文档中,实体是A的对象,那么保存工作如下:

collection.Save<A>(entity);

Save 方法将根据 Id 执行插入或更新,我的问题是:当我第二次执行 collection.Save(entity) 时,这意味着实体文档已经存在于 A 集合中,是否 A 中的每个字段B文件更新了吗?我不知道驱动程序如何处理这种事情。假设有很多 B 对象,比如说 100 个并且没有修改。什么过程?

【问题讨论】:

    标签: mongodb updates mongodb-.net-driver


    【解决方案1】:

    当您调用Save 时,根据您的[BsonId] 字段驱动程序决定如何处理此文档:

    • 如果集合中不存在带有Id的文档,它将insert这个文档
    • 如果集合中存在Id 的文档,它将update 这个文档(基于您的Id)。更新意味着它将用您的 entity 中的新字段替换所有字段

    下面是save 方法在伪代码中如何工作的示例(与 C# 驱动程序中的相同):

       function save( doc ) {
          if( doc["_id"] ) {
             update( {_id: doc["_id"] }, doc, { upsert: true } );
          }
          else {
             insert(doc);
          }
       }
    

    【讨论】:

    • 感谢您的耐心解答,我认为这句话:“更新意味着它将用您实体中的新字段替换所有字段”是有价值的,这样,B 对象中的所有字段都会得到替换,那个 B 数字可能很大。我正在寻找这样的解决方案:调用collection.Save(entity)方法时,B文档会在相应对象被修改时更新,否则,不要做“所有替换的东西”。
    • 我可以建议您:1) 计算您的B 字段的哈希值并将其存储在您的文档中。 2) 在保存之前,通过Id 获取您的文档 3) 如果不存在 - 只需插入。 4) 如果存在,请计算您的 entity.B 字段的哈希值并与现有文档哈希值进行比较 5) 如果哈希值相同 - 什么也不做。如果不同 - 保存此文档
    • 您可能会考虑使用 upsert=true 进行更新并将 B 指定为 $addToSet 。 $addToSet 获取数组的每个元素,仅当目标数组字段不存在时才将其添加到目标数组字段中。
    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多