簡體   English   中英

如何使用 & 和 | 為 c# 中的 MongoDB 構建動態查詢運營商

[英]How to build dynamic queries for MongoDB in c# using both & and | operators

所以我有一個鍵值對列表,鍵是一個字符串,值是一個字符串數組,如下所示:

{
    "filters": [
        {"key": "team", "value": ["3","4","7"]},
        {"key": "placement_type", "value": ["facility"]}
        //{"key": "date", "value": ["2021-01-01"]}
        //{"key": "policy", "value": ["something"]} Number of filters may vary
    ]
}

這個“過濾器”列表可以有多個鍵值對,具體取決於用戶選擇的過濾器數量。

所以我需要動態創建的是以下查詢:

(builder.Eq("team", "3") | builder.Eq("team", "4") | builder.Eq("team", "7")) & builder.Eq("placement_type", "Facility");

這是我的嘗試:

var builder = Builders<ReportDocument>.Filter;

// IF I USE THIS QUERY IT WORKS AS I EXPECT
var hardCodedQuery = (builder.Eq("team", "3") | builder.Eq("team", "4") | builder.Eq("team", "7")) & builder.Eq("placement_type", "Facility");

var dynamicQuery = builder.Empty;
var orFilters = builder.Empty;

foreach (var filter in request.Filters)
{
  if (filter.Value.Length > 1)
  {
     for (int i = 0; i < filter.Value.Length; i++)
     {
        if (i == 0)
        {
          orFilters = builder.Eq(filter.Key, filter.Value[i]); //Had to do this since i have to initiate the variable as builder.Empty and it was adding and EmptyFilterDefinition
        }
        else
        {
          orFilters &= builder.Eq(filter.Key, filter.Value[i]);
        }
      }
      dynamicQuery = builder.Or(orFilters);
   }
   else
   {
      dynamicQuery &= builder.Eq(filter.Key, filter.Value);
   }
}
return await _reportsCollection.Find(dynamicQuery).ToListAsync();

但是一旦我在變量“orFilters”中插入第二個過濾器,運算符“&= e 就變成了 MongoDB.Driver。 AndFilterDefinition而不是 MongoDB.Driver。 或過濾器定義

因此,如果有人有這樣做的好方法,請分享給大家。 我在 stackoverflow 中看到了很多與我的問題類似的問題,但所有參考都只使用 & (And) 運算符做動態過濾器。 但是因為我有一個字符串列表作為值,所以我需要使用 | (或)運算符也是如此。

謝謝

您的第一個復合分配與您的預期查詢不匹配,在您的示例中您使用OR但在您的代碼中您使用的是AND分配

....
if (filter.Value.Length > 1)
  {
     for (int i = 0; i < filter.Value.Length; i++)
     {
        if (i == 0)
        {
          orFilters = builder.Eq(filter.Key, filter.Value[i]); //Had to do this since i have to initiate the variable as builder.Empty and it was adding and EmptyFilterDefinition
        }
        else
        {
          // this line was changed 
          orFilters |= builder.Eq(filter.Key, filter.Value[i]);
        }
      }
      //also when this line run, you are resetting your filter so pay attention to it, should change
      dynamicQuery = builder.Or(orFilters);
   }
   .....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM