【问题标题】:Translate to Mongodb C# Driver转换为 Mongodb C# 驱动程序
【发布时间】:2018-02-16 22:06:29
【问题描述】:

有人可以帮我将以下内容翻译成 mongodb 2.4 C# 驱动程序的代码吗?我一直试图让这个工作,但我很难弄清楚。当我通过 C# 驱动器运行以下 mongo 查询时,我没有得到任何记录。当我运行 mongo 命令行时,我得到了 2 条记录。 我只需要了解我在做什么会导致使用 C# 驱动程序时的行为差异。

到目前为止,我有以下 C# 驱动程序:

 public IEnumerable<ComponentRecordDataModel> GetComponentRecords(
        )
        {
            var componentTypeFilter = Builders<ComponentRecordDataModel>.Filter.Eq(x => x.ComponentType, "Investment");
            var authorizedUserFilter =
                Builders<ComponentRecordDataModel>.Filter.AnyEq(x => x.AuthorizedUserIds, "59e8c1d35e13de1494887658");

            var componentFieldFilters = new List<FieldValueDataModel>
            {
                new FieldValueDataModel()
                {
                    FieldId = "59d664d1c153f67518f98888",
                    Value = "gov"
                },
                new FieldValueDataModel()
                {
                    FieldId = "59d664d1c153f67518f98889",
                    Value = "azure"
                }
            };

            var componentFilters = new List<FilterDefinition<FieldValueDataModel>>();
            foreach (var componentFieldFilter in componentFieldFilters)
            {

                var bsonRegex = new BsonRegularExpression(Regex.Escape(componentFieldFilter.Value), "i");
                componentFilters.Add(Builders<FieldValueDataModel>.Filter.And(new[]
                {
                    Builders<FieldValueDataModel>.Filter.Eq(x => x.FieldId, componentFieldFilter.FieldId),
                    Builders<FieldValueDataModel>.Filter.Eq(x => x.Value, bsonRegex)
                }));
            }

            var fieldFilter = Builders<ComponentRecordDataModel>.Filter.ElemMatch(
                x => x.Fields, Builders<FieldValueDataModel>.Filter.Or(componentFilters)
                );

            var filter = componentTypeFilter & authorizedUserFilter & fieldFilter;
            var renderedFilter = filter.ToJson();

            return MongoContext.Find(filter).ToList();
        }

/我尝试复制的 mongodb 查询如下所示/

db.getCollection('componentRecords').aggregate(
    [{
            $match: {
                "componentType": "Investment"
            }
        },
        {
            $match: {
                "authorizedUserIds": {
                    $elemMatch: {
                        $in: ["59e8c1d35e13de1494887658"]
                    }
                }
            }
        },
        {
            $match: {
                "fields": {
                    $elemMatch: { $or:
                     [{ $and : [
                                    { fieldId: ObjectId("59d664d1c153f67518f98888") },
                                    { value: { "$regex": "gov", '$options' : 'i' } }
                                    ]},
                                                           { $and : [
                                    { fieldId: ObjectId("59d664d1c153f67518f98889") },
                                    { value: { "$regex": "azure", '$options' : 'i' } }
                                    ]}                 
                                                                            ] 

                    }
                }
            }
        }
    ])

【问题讨论】:

  • 到目前为止你翻译了什么?你能提供sn-ps吗?
  • SO 不会将代码从一种语言翻译成另一种语言。请表现出你的努力,非常好的人会很荣幸能帮助你。
  • 你能添加几个示例文件和 poco 吗?你能确认fieldId 是objectID 而authorizedUserIds 是十六进制字符串吗?

标签: c# .net mongodb mongodb-query mongodb-.net-driver


【解决方案1】:

您是否尝试过使用 linq ?它可能更容易理解和编写:

var arr = new [] { "59e8c1d35e13de1494887658" };
var id1 = ObjectId("59d664d1c153f67518f98888");
var gov = "gov";

var id2 = ObjectId("59d664d1c153f67518f98889");
var azure = "azure";

collection.AsQuerable().Where(w =>
w.componentType == "Investment" &&
w.authorizedUserIds.Any(a => arr.Contains(a.X)) &&
(
 (w.fieldId == id1 && w.value.ToLower() == go".ToLower()) ||
 (w.fieldId == id2 && w.value.ToLower() == azure.ToLower()) ||
)
).ToList();

实际上我并没有在实际示例中尝试此代码,而是在 mongodb 中使用 linq。

【讨论】:

  • 我想过这个,但我们的团队更喜欢使用 FilterDefinition,因为我们可以序列化过滤器定义并与将传递到数据库的预期查询进行比较。与 linq 相比,我们也更愿意使用通过驱动程序提供的本机运算符,因为我们不确定 linq 翻译的底层发生了什么。很好的建议,如果一切都失败了,我会考虑这个解决方案。
  • 您可以在最后使用ToJson() 序列化整个查询。使用 linq 会让生活更轻松,不会失去性能,我认为,因为我认为它不像 linq to sql,后者使用复杂的 sql 语法来获得你想要的,但是对于 mongo,它对特定数量的方法和过滤器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2012-09-23
  • 1970-01-01
相关资源
最近更新 更多