使用C#驱动程序更新MongoDB中的多个数组项

哈米德·莫拉雷扎(Hamid Molareza)

我有一个类似此示例的文档:

    [
{ 
"_id" : "id1",     
"items" : [
    {
        "_id" : "f449dc0b-3d1b-4a59-b622-6a42ce10b147",
        "token" : "aaa",  
        "isExpired" : false, 
        "expiredAt" : ISODate("")
    }, 
    {
        "_id" : "3d1497d7-f74c-4d88-b15c-bf2f9c736374", 
        "token" : "bbb",  
        "isExpired" : false, 
        "expiredAt" : ISODate("")
    }, 
    {
        "_id" : "6e827e2a-5a25-4343-b646-885816bb8cc4", 
        "token" : "ccc",  
        "isExpired" : false, 
        "expiredAt" : ISODate("")
    }]
},
...,
...
]

如果我有_id文档的和token项目的,那么如何使除给定令牌以外的所有项目过期

例如,如果文档ID为"id1",令牌为"aaa",则我希望"bbb""ccc"令牌过期。

我更喜欢用单个查询完成操作,而不用替换整个文档或数组。

我的代码是这样的,但是每次只有一项过期:

var filter = Builders<Document>.Filter
.And(
    Builders<Document>.Filter.Eq(d => d.Id, "id1"), 
    Builders<Document>.Filter.ElemMatch(d => d.items, item => item.token != "aaa"));

var update = Builders<Document>.Update
            .Set(x => x.items[-1].isExpired, true)
            .Set(x => x.items[-1].expiredAt, DateTime.UtcNow);
凯文·史密斯

因此,首先,我将插入您给定的示例记录,但将expiredAts全部设置为null。

> db.test.insert({
    "_id" : "id1",
    "items" : [
        {
            "_id" : "f449dc0b-3d1b-4a59-b622-6a42ce10b147",
            "token" : "aaa",
            "isExpired" : false,
            "expiredAt" : null
        },
        {
            "_id" : "3d1497d7-f74c-4d88-b15c-bf2f9c736374",
            "token" : "bbb",
            "isExpired" : false,
            "expiredAt" : null
        },
        {
            "_id" : "6e827e2a-5a25-4343-b646-885816bb8cc4",
            "token" : "ccc",
            "isExpired" : false,
            "expiredAt" : null
        }]
    })
WriteResult({ "nInserted" : 1 })

现在对于C#,我们需要利用数组过滤器,因为普通查找可以更新数组中的一项(使用位置$)或更新数组中的所有项(使用所有位置运算符$ [])。

var client = new MongoClient();

var db = client.GetDatabase("test");
var collection = db.GetCollection<Document>("test");


var filter = Builders<Document>.Filter.Eq(d => d.Id, "id1");

var update = Builders<Document>.Update
    .Set("items.$[i].isExpired", true)
    .Set("items.$[i].expiredAt", DateTime.UtcNow);

var arrayFilterDefinitions = new ArrayFilterDefinition[]
{
    new BsonDocumentArrayFilterDefinition<Item>(BsonDocument.Parse(@"{ ""i.token"" : { $ne: ""aaa"" } }"))
};
await collection.UpdateOneAsync(filter, update, new UpdateOptions{ArrayFilters = arrayFilterDefinitions});

执行上述操作只会更新令牌中不是“ aaa”的数组中的项目。

可以在MongoDB文档中找到更多信息-https: //docs.mongodb.com/manual/reference/operator/update/positional-filtered/#identifier

> db.test.findOne()
{
        "_id" : "id1",
        "items" : [
                {
                        "_id" : "f449dc0b-3d1b-4a59-b622-6a42ce10b147",
                        "token" : "aaa",
                        "isExpired" : false,
                        "expiredAt" : null
                },
                {
                        "_id" : "3d1497d7-f74c-4d88-b15c-bf2f9c736374",
                        "token" : "bbb",
                        "isExpired" : true,
                        "expiredAt" : ISODate("2020-08-13T15:57:00.582Z")
                },
                {
                        "_id" : "6e827e2a-5a25-4343-b646-885816bb8cc4",
                        "token" : "ccc",
                        "isExpired" : true,
                        "expiredAt" : ISODate("2020-08-13T15:57:00.582Z")
                }
        ]
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MongoDB使用C#驱动程序根据数组中的第N个值更新多个记录

如何使用C#驱动程序更新MongoDB数组中的子文档

如何使用C#驱动程序更新MongoDB中数组子文档中包含的数组子文档中的字段?

mongodb C#驱动程序更新多个字段

MongoDB C#驱动程序-更新嵌入式文档数组中的所有字段

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

如何在MongoDB 2.7中使用MongoDB C#驱动程序更新通用类型

如何使用C#更新MongoDB中的子数组项

使用 C# Mongodb 强类型驱动程序在事务中创建多个索引

使用MongoDB C#驱动程序从父子层次结构中查找和更新节点

如何使用C#驱动程序删除mongodb文档中的嵌套数组元素

如何使用最新的MongoDB C#驱动程序根据多个条件删除复杂数组对象的嵌套数组中的元素?

Mongodb通过C#驱动程序使用多个字段匹配更新嵌入式文档

无法在IMongoQueryable mongodb c#驱动程序linq语句上从GroupBy中的组获取组项目

使用数组更新运算符 $[<identifier>] 与以下查询等效的 MongoDB C# 驱动程序是什么?

在C#驱动程序中更新mongodb集合比在Shell中更新要慢得多

Mongodb C#驱动程序更新所有子数组元素

MongoDB C#官方驱动程序批量更新

使用MongoDB和C#新驱动程序版本(2.0)更新集合中的嵌入式文档

如何使用Mongodb C#驱动程序加入多个集合

MongoDB C# 驱动程序是否使用 ForEachAsync 缓冲多个文档?

mongoDB:C#驱动程序V2如何更新嵌套集合中的项目

Mongodb C# 驱动程序只返回数组中匹配的子文档

c# MongoDB 驱动程序,从嵌套数组中检索对象

如何使用MongoDB C#驱动程序更新泛型类型

使用MongoDB C#驱动程序更新列表内的字段

使用Java驱动程序在MongoDB中更新阵列

在MongoDB C#驱动程序中获取生成的脚本

如何使用MongoDB C#驱动程序进行$ lookup?