Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#驱动程序的MongoDB更新阵列_C#_Mongodb - Fatal编程技术网

使用C#驱动程序的MongoDB更新阵列

使用C#驱动程序的MongoDB更新阵列,c#,mongodb,C#,Mongodb,使用MongoDB,如何使用C#驱动程序更新文档中的单个数组元素 请允许我设置这个。假设有一个集合,称为“东西”。在Things集合中,有许多文档。以下是两个“东西”文档: { "_id":"2d7fcf21-34b8-4537-b07f-01659d87eda4", "Name":"Something", "Stuff":[ { "Id":"1fdd098c-5e60-4dd8-a6a6-96b26cd90dc9",

使用MongoDB,如何使用C#驱动程序更新文档中的单个数组元素

请允许我设置这个。假设有一个集合,称为“东西”。在Things集合中,有许多文档。以下是两个“东西”文档:

{
    "_id":"2d7fcf21-34b8-4537-b07f-01659d87eda4",
    "Name":"Something",
    "Stuff":[
        {
            "Id":"1fdd098c-5e60-4dd8-a6a6-96b26cd90dc9",
            "Completed":false
        },
        {
            "Id":"b63cc911-a577-4744-bb0f-b9d9deabcf66",
            "Completed":false
        }
    ]
}


{
    "_id":"d4ba4420-238f-4e11-9ad8-721dc3eb0ad7
    ",
    "Name":"Another Thing",
    "Stuff":[
        {
            "Id":"f2d46144-15eb-4451-851a-cba80dd8949b",
            "Completed":false
        },
        {
            "Id":"f2d46144-15eb-4451-851a-cba80dd8949b",
            "Completed":false
        }
    ]
}
若我有文档的_id,以及要更改的数组中项目的id,那个么如何在不替换整个文档或数组的情况下将“Completed”属性从false切换为true


我在这里显示的数据不是我正在处理的应用程序的实际数据,它是为本例设计的。另外,我使用的是C#MongoDB驱动程序v2.7.2,我的数据库运行在Atlas上的MongoDB v4上。

要更新嵌套数组中的单个项,需要使用额外的过滤器来表示嵌套数组中的过滤。该过滤器可以用C#中的
ElemMatch
表示。然后,要引用匹配的子文档,可以将
-1
传递给嵌套数组的索引器。尝试:

var documentId = "2d7fcf21-34b8-4537-b07f-01659d87eda4";
var stuffId = "1fdd098c-5e60-4dd8-a6a6-96b26cd90dc9";

var filter = Builders<YourModel>.Filter.And(Builders<YourModel>.Filter.Eq(x => x._id, documentId), 
    Builders<YourModel>.Filter.ElemMatch(x => x.Stuff, f => f.Id == stuffId));

var update = Builders<YourModel>.Update.Set(model => model.Stuff[-1].Completed, true);

Col.UpdateOne(filter, update);
var documentId=“2d7fcf21-34b8-4537-b07f-01659d87eda4”;
var stuffId=“1fdd098c-5e60-4dd8-a6a6-96b26cd90dc9”;
var filter=Builders.filter.And(Builders.filter.Eq(x=>x.\u id,documentId),
Builders.Filter.ElemMatch(x=>x.Stuff,f=>f.Id==stuffId));
var update=Builders.update.Set(model=>model.Stuff[-1]。已完成,true);
Col.UpdateOne(过滤器,更新);

这正是我需要的。它工作得很好。我开始怀疑我是否需要这样做,但我不确定,我也不知道如何使用这个操作符。非常感谢。