[英]Update multi items of array in MongoDB using C# Driver
我有一個像這個樣本的文件:
[
{
"_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")
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.