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

托尔加女巫

我在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)
    })))
});

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试使用MongoDB Java驱动程序更新文档

mgo,mongodb:从嵌入式结构中查找与一个字段匹配的文档

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

MongoDB C#驱动程序2.0-更新文档

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

使用MongoDB和C#新驱动程序版本(2.0)更新嵌入式文档属性

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

如何使用C#驱动程序在无类MongoDB上找到匹配的'StartsWith'文档

在MongoDB中排除嵌入式文档中除单个字段之外的所有字段

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

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

在MongoDB中的多个文档中更新多个嵌入式文档

使用C#获取和添加/更新多层嵌入式/嵌套MongoDB文档

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

Mongodb C#驱动程序Perform字符串包含对嵌入式文档中的属性的查询

MongoDB聚合:通过动态字段路径从嵌入式文档添加字段

带有聚合管道的MongoDB C#驱动程序更新文档

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

Rails自动完成多个字段上的嵌入式文档

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

Mongodb更新嵌入式字段

何时使用嵌入式文档MongoDB

如何在MongoDB C#驱动程序中按值的字段范围选择文档?

使用C#在MongoDB集合中的嵌入式文档的子句查询中的投影

Derby 仅使用嵌入式驱动程序运行

MongoDB C# 驱动程序:如何将 $in 运算符用于嵌套的嵌入式文档?

Mongodb node.js 查询嵌入式文档具有多个值的单个字段。

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

用于编写嵌入式驱动程序的序列