如何在C#中实现MongoDB嵌套的$ elemMatch查询

Aar*_*ini 2 c# mongodb mongodb-.net-driver

我有以下格式的MongoDB集合。

{
"_id" : ObjectId("56c6f03ffd07dc1de805e84f"),
"Details" : {
    "a" : [
            [ { 
                "DeviceID" : "log0", 
                "DeviceName" : "Dev0"
              },
              { 
                "DeviceID" : "log1", 
                "DeviceName" : "Dev1"
              }
            ],
            [ { 
                "DeviceID" : "Model0", 
                "DeviceName" : "ModelName0"
              },
              { 
                "DeviceID" : "Model1", 
                "DeviceName" : "ModelName1"
              }
            ]
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我正在尝试获取DeviceName数组“ a”中包含特定值(例如“ Name0”)的所有文档。但是,使用下面的Mongo查询时,我可以获得所需的结果:

db.test_collection.find({"Details.a":{$elemMatch:{$elemMatch:{DeviceName : /.*Name0.*/}}}});
Run Code Online (Sandbox Code Playgroud)

现在,我正在努力用C#实现上述查询。有人可以指导我吗?

到目前为止,我已经尝试了下面的代码,它没有按预期工作

query = Query.And(Query.ElemMatch("Details.a", Query.And(Query.ElemMatch("DeviceName", Query.Matches("DeviceName", new BsonRegularExpression("Name0"))))));
Run Code Online (Sandbox Code Playgroud)

提前致谢

Sal*_*eem 7

好吧,老实说,用C#编写查询有点棘手,但是您总可以发挥一些技巧。

var bsonQuery = "{'Details.a':{$elemMatch:{$elemMatch:{DeviceName : /.*Name0.*/}}}}";
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(bsonQuery);

var result = col.FindSync (filter).ToList();
Run Code Online (Sandbox Code Playgroud)

我正在将普通的MongoDB查询反序列化为BsonDocument,作为回报,我将其作为过滤器传递给FindAsync。

最后,您将在可变结果中获得理想的结果。

注意:我假设已经建立了MongoDB连接,并且变量col持有对MongoDB集合的引用。

编辑:请参阅以下链接https://groups.google.com/forum/#!topic/mongodb-csharp/0dcoVlbFR2A。现在,已经确认C#驱动程序不支持无名称过滤器,因此不支持使用now编写上述查询Buidlers<BsonDocument>.Filter

长话短说,您只有一个选择,那就是要像我在解决方案中提到的那样进行查询。