我对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发出这样的请求?
发布于 2017-04-03 12:00:18
最后,我想出了自己的解决方案。使用常规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)
})))
});发布于 2017-03-22 06:09:42
您是否试图匹配数组中的任何元素?如果是这样的话,这是可行的:
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;https://stackoverflow.com/questions/42943869
复制相似问题