首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个字段匹配与C#驱动程序匹配的Mongodb更新嵌入式文档

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

Stack Overflow用户
提问于 2017-03-22 06:02:44
回答 2查看 640关注 0票数 3

我对mongodb有一个文档结构,如下所示:

代码语言:javascript
复制
{
    _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过滤器匹配的子文档,这实际上是可行的;

代码语言:javascript
复制
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语句,因此它不能像预期的那样工作。

代码语言:javascript
复制
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发出这样的请求?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-03 12:00:18

最后,我想出了自己的解决方案。使用常规BsonDocument对象创建过滤器完成了这项工作。

代码语言:javascript
复制
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)
    })))
});
票数 1
EN

Stack Overflow用户

发布于 2017-03-22 06:09:42

您是否试图匹配数组中的任何元素?如果是这样的话,这是可行的:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42943869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档