![](/img/trans.png)
[英]MongoDB C# Driver - update all fields in embedded array of documents
[英]Mongodb Update Embedded Documents Using Multiple Field Matches with C# driver
我在mongodb上有一個文檔結構,如下所示:
{
_id: <string>,
field1: ...,
field2: ...,
field3: ...,
DeviceVersionPairs: [{
DeviceId: <ObjectId>,
CloudFolderId: <ObjectId>,
CloudFileId: <ObjectId>,
VersionId: <ObjectId>,
Status: <int>
},{
DeviceId: <ObjectId>,
CloudFolderId: <ObjectId>,
CloudFileId: <ObjectId>,
VersionId: <ObjectId>,
Status: <int>
},
....
]
}
我寫這MongoDB的查詢,它的目的是找到具有該行_id
比更新其子文檔給出DeviceVersionPairs
陣列匹配elemMatch
過濾器,它的實際工作;
db.deduplications.update({
"_id": "...",
"DeviceVersionPairs": { "$elemMatch" : {
"DeviceId": ObjectId("..."),
"CloudFolderId": ObjectId("..."),
"CloudFileId": ObjectId("..."),
"VersionId": ObjectId("...")
}}
},{
"$set": { "DeviceVersionPairs.$.Status": 100 }
}, false, false)
但我無法將其轉換為與C#驅動程序(2.0.1.27)一起使用。 到目前為止,我有這個,但這缺乏elemMatch
語句,因此它沒有按預期工作。
var p = DbContext.Deduplications.FindOneAndUpdateAsync(
filter: Builders<Dal.Deduplication>.Filter.And(
Builders<Dal.Deduplication>.Filter.Eq("_id", fileHash),
Builders<Dal.Deduplication>.Filter.Eq("DeviceVersionPairs.DeviceId", deviceId),
Builders<Dal.Deduplication>.Filter.Eq("DeviceVersionPairs.CloudFolderId", CloudFolderId),
Builders<Dal.Deduplication>.Filter.Eq("DeviceVersionPairs.CloudFileId", FileId),
Builders<Dal.Deduplication>.Filter.Eq("DeviceVersionPairs.VersionId", versionIdToBeRemoved)),
update: Builders<Dal.Deduplication>.Update.Set("DeviceVersionPairs.$.Status", DVPStatus.PassiveOrDeleted)).Result;
使用C#驅動程序向mongodb發出此類請求的方法是什么?
最后,我想出了自己的解決方案。 使用常規BsonDocument
對象創建過濾器完成了這項工作。
var filter = new BsonDocument(new List<BsonElement> {
new BsonElement("_id", fileHash),
new BsonElement("DeviceVersionPairs", new BsonDocument("$elemMatch", new BsonDocument(new List<BsonElement> {
new BsonElement("DeviceId", deviceId),
new BsonElement("CloudFolderId", cloudFolderId),
new BsonElement("CloudFileId", cloudFileId),
new BsonElement("VersionId", versionId)
})))
});
您是否嘗試匹配陣列中的任何元素? 如果是這樣,這應該工作:
var p = DbContext.Deduplications.FindOneAndUpdateAsync(
filter: Builders<Dal.Deduplication>.Filter.AnyEq(
Builders<Dal.Deduplication>.Filter.Eq("_id", fileHash),
Builders<Dal.Deduplication>.Filter.Eq("DeviceVersionPairs.DeviceId", deviceId),
Builders<Dal.Deduplication>.Filter.Eq("DeviceVersionPairs.CloudFolderId", CloudFolderId),
Builders<Dal.Deduplication>.Filter.Eq("DeviceVersionPairs.CloudFileId", FileId),
Builders<Dal.Deduplication>.Filter.Eq("DeviceVersionPairs.VersionId", versionIdToBeRemoved)),
update: Builders<Dal.Deduplication>.Update.Set("DeviceVersionPairs.$.Status", DVPStatus.PassiveOrDeleted)).Result;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.