用c#更新Mongo中的嵌套数组

时间:2017-01-19 13:46:07

标签: c# .net mongodb mongodb-.net-driver

我有这样的文件

{
"_id": "63dafa72f21d48312d8ca405",
"tasks": [{
    "_ref": "63d8d8d01beb0b606314e322",
    "data": {
        "values": [{
            "key": "Deadline",
            "value": "2014-10-13"
        }]
    }
}, {
    "_ref": "84dd046c6695e32322d842f5",
    "data": {
        "values": []
    }
}]
}

现在,如果_ref字段与我的输入匹配,我想更新数据内部值的值。

到目前为止我的代码:

public bool updateProject(Project dbPro, Project pro)
{
    var collection = db.GetCollection<BsonDocument>("projects");
    var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse( dbPro.Id));
    var update = Builders<BsonDocument>.Update.AddToSetEach("tasks", pro.Tasks);
    var result = collection.UpdateOne(filter, update);
    if (result.IsModifiedCountAvailable)
    {
        if (result.ModifiedCount == 1)
        {
            return true;
         }
    }
    return false;
}

目前,此代码仅将文档附加为新任务,而不是将值附加到匹配任务。也许有人知道如何实现这种行为?

更新

我试过像@Shane Oborn说的那样。但它仍然不适合我。

            var collection = db.GetCollection<BsonDocument>("projects");
        var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse( dbPro.Id));
        var update = Builders<BsonDocument>.Update.Push("tags", buildBsonArrayFromTags(pro.Tags));
        var result = collection.UpdateOne(filter, update);
        if (result.IsModifiedCountAvailable)
        {
            if (result.ModifiedCount == 1)
            {
                return true;
            }

        }


        return false;
    }

而是覆盖数据,它将数组附加到我的数组。

enter image description here

更新

确定而不是推,我确实需要设置。然后它起作用了。

1 个答案:

答案 0 :(得分:2)

我没有确切的代码可访问,但很接近。我有一个执行&#34; upserts&#34; (&#34;添加&#34;如果是新的,或者#34;更新&#34;如果存在的话)。这应该让你接近:

// The variable "doc" below is a BsonDocument

var updateRequests = new List<WriteModel<BsonDocument>>();
updateRequests.Add(new ReplaceOneModel<BsonDocument>(
    CreateBsonDocumentFilterDefinition(filterKeyName, filterKeyValue), doc)
    {
        IsUpsert = true
    });
var writeResult = await collection.BulkWriteAsync(updateRequests);

这里的关键对象是&#34; ReplaceOneModel&#34;和#34; IsUpsert&#34;过滤器定义的属性。

祝你好运!

<强>更新

我在子文档中进行更新的另一种方法如下所示:

// Below, "subDocument" is a BsonDocument, and "subDocArrayName" is a string
// that should match the name of the array that contains your sub-document
// that will be updated.

var collection = _database.GetCollection<BsonDocument>(collectionName);

var builder = Builders<BsonDocument>.Update;
var update = builder.Push(subDocArrayName, subDocument);

await collection.UpdateOneAsync(CreateBsonDocumentFilterDefinition(filterKeyName, filterKeyValue), update);