使用C#驱动程序查找MongoDB文档并仅匹配数组元素。

3
我试图返回一个文档,这个文档应该被过滤,只包含一个项目的数组。我看到了很多类似的问题,但没有一个处理动态查询。可能有几个约束条件,所以我必须能够继续添加过滤器。
{
  "_id" : ObjectId("6058f722e9e41a3d243258dc"),
  "fooName" : "foo1",
  "fooCode" : 1,
  "bar" : [
    {
      "barCode" : "123",
      "barName" : "Rick's Cafe",
      "baz" : [
        {
          "bazId" : "00",
          "bazDescription" : "Ilsa"
        },
        {
          "bazId" : "21",
          "bazDescription" : "Victor"
        }
      ]
    },
    {
      "barCode" : "456",
      "barName" : "Draco Tavern",
      "baz" : [
        {
          "bazId" : "00",
          "bazDescription" : "Rick Shumann"
        }
      ]
    }
  ]
}

这是我的尝试,它返回一个文档,其中的数组包含条形码,并且整个数组的内容都被包括在内。
Expression<Func<Foo, bool>> filter = x => x.FooCode == 1;

string barCode = "456"
if (!String.IsNullOrEmpty(barCode))
{
  Expression<Func<Foo, bool>> newPred =
    x => x.Bar.Any(s => s.BarCode == barCode);
  filter = filter.CombineAnd(newPred);
}

var fooQuery =
  _fooCollection
    .Find(filter);

如果指定了数组元素,如何删除不匹配的数组元素?

2个回答

1
你需要在MongoDB中使用聚合操作。你可以使用unwind分割数组元素,使用match过滤,使用project选择所需的键,使用id或其他公共列进行group
MongoDB聚合文档: https://docs.mongodb.com/manual/aggregation/

那么如何使用C#驱动程序实现,并考虑动态过滤器?这就是我卡住的地方。 - Rick DeBay

1
  1. Unwind 将单个文档转换为嵌套数组元素形式的每个文档:
{
  "_id" : ObjectId("6058f722e9e41a3d243258dc"),
  "fooName" : "foo1",
  "fooCode" : 1,
  "bar": {
    "barCode" : "123",
    "barName" : "Rick's Cafe",
    ...
  }
}
  1. Match 用于查找您想要的元素
  2. Group 用于重新组合嵌套数组

因此,生成的C#代码可能如下所示:

var fooQuery = _fooCollection.Aggregate()
                .Unwind("bar")
                .Match(BsonDocument.Parse("{ 'bar.barcode': '"+ barCode + "'}"))
                .Group(BsonDocument.Parse("{​​​​​ '_id':'$fooCode' }​​​​​"))

感谢您的服务,将军。是否有一种表单可以从查询中删除字符串?这样匹配的解析就是m=>bar.barCode==barcode。我之所以问这个问题,是因为我曾经遇到过类似的情况,完全流利的查询编译通过,但在运行时出现异常。 - Rick DeBay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接