【问题标题】:Lambda where fails but string where worksLambda where 失败但 string where 工作
【发布时间】:2017-05-26 00:15:20
【问题描述】:

使用旧的 MongoDB 驱动程序,我能够执行以下查询:

Query.Where("this.plan.sstats.used < this.plan.sstats.available")

但是有了新的,我不得不这样写:

builder.Filter
      .Where(t => t.Plan.StorageStats.UploadUsed < t.Plan.StorageStats.UploadAvailable)

这些看起来一样,但新的不起作用,我收到以下错误消息:

附加信息:不支持的过滤器:({plan.sstats.used}

后端版本目前是相同的,所以我看不出有什么理由不能继续工作。

我该如何解决这个问题?有没有更好的方法来做到这一点,同时保持原子性?

【问题讨论】:

  • 当您说旧/新时,您使用的是什么确切版本?
  • @Liam New 是 2.4,之前是 1.something。我现在不在工作,所以无法查看。

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


【解决方案1】:

似乎 MongoDb 驱动器不再支持它了。我个人认为两种可能的解决方案:

1) 您查询应该可以工作的 bson,而不是您的对象(我已尝试使用我的示例数据):

FilterDefinition<BsonDocument> filter = 
    new BsonDocument("$where", "this.plan.sstats.used<this.plan.sstats.available");

这种方法不好:您应该将您的收藏查询为BsonDocument 收藏。

2) 您将您的集合查询为ToEnumerable(),而不仅仅是将您的过滤器添加为Where linq 语句。这也可以,但是您可以直接在mongodb 上丢失查询数据。

3) 你可以使用聚合框架,我是这样做的:

var result = collection.Aggregate()
        .Group(r => r.Plan.StorageStats.UploadUsed - r.Plan.StorageStats.UploadAvailable,
              r => new {r.Key, Plans= r.Select(t=>t.Plan)} )
        .Match(r=>r.Key < 0)
        .ToEnumerable()
        .SelectMany(r=>r.Plans);

对聚合的负面影响是您无法将其与您在 Find() 通话中使用的其他过滤器结合使用。

【讨论】:

  • 马克西姆,感谢您的回复。不幸的是,我们一直在使用它进行原子更新,同时确保满足某些条件,因此这种方法行不通。
  • @john 您仍然可以直接使用 bson(解决方案 1),否则您将不得不拆分查询并首先读取您需要更新的所有 id,然后构建包含过滤器。
  • 这就是我希望避免的 :) 谢谢你的帮助。
【解决方案2】:

所以,我还询问了 Mongo 的 JIRA,并将其作为潜在的替代方案。我把它贴在这里以防有人对 Maksim 的回答不满意。


可以只创建一个过滤器定义:

FilterDefinition<C> filter = new JsonFilterDefinition<C>("{ $where : \"this.plan.sstats.used < this.plan.sstats.available\" }");

由于可以将字符串转换为 FilterDefinitions,因此您也可以编写以下任一代码,最终都会创建 JsonFilterDefinition: var filter = (FilterDefinition&lt;C&gt;)"{ $where : \"this.plan.sstats.used &lt; this.plan.sstats.available\" }";

// or using an implicit conversion

FilterDefinition<C> filter = "{ $where : \"this.plan.sstats.used < this.plan.sstats.available\" }";

【讨论】:

  • 酷,它有效吗?你在做普通的 json 过滤器并取回你的 Plans 对象吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2014-08-08
  • 2015-07-21
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
相关资源
最近更新 更多