Mongodb C# 驱动程序只返回数组中匹配的子文档

大卫·古德

我有一个这种格式的文件:

{
    _id: ...,
    myArray: [{other: stuff}, {other: stuff}, ...],
    ...
}

我要找到匹配的某些事情,像元素_id从子文档或字段值myArray

我想返回文档,但过滤后MyArray只存在匹配的子文档。

我尝试进行投影并包含这样的匹配元素:

_mongoContext.myDocument
    .Find(x => x.id == id & x.myArray.Any(y => myList.Contains(t.other)))
    .Project<myModel>(Builders<myModel>.Projection.Include("myArray.$"))

我认为,这应该只返回匹配的第一个元素myArray而不是所有文档,这不是我想要的(我希望与查询匹配的所有子文档都存在于返回的文档中)。

无论如何它甚至没有工作,我收到一个positional projection does not match the query document错误。也许是因为我没有使用FindOne

无论如何,我怎样才能实现我想要的?(见粗体问题)

米克尔

通常您需要在聚合框架中使用$filter来过滤嵌套数组。然而,使用 MongoDB .NET 驱动程序和IQueryable接口有一种更简单的方法来实现这一点

考虑最简单的模型:

public class MyModel
{
    public string _id { get; set; }
    public IEnumerable<MyNestedModel> myArray { get; set; }
}

public class MyNestedModel
{
    public string other { get; set; }
}

以及以下数据:

var m = new MyModel()
{
    _id = "1",
    myArray = new List<MyNestedModel>() {
        new MyNestedModel() {  other = "stuff" },
        new MyNestedModel() { other = "stuff" },
        new MyNestedModel() { other = "stuff2" } }
};

Col.InsertOne(m);

您可以简单地调用.AsQueryable()您的集合,然后您可以编写 LINQ 查询,该查询将由 MongoDB 驱动程序转换为$filter,尝试:

var query = from doc in Col.AsQueryable()
            where doc._id == "1"
            select new MyModel()
            {
                _id = doc._id,
                myArray = doc.myArray.Where(x => x.other == "stuff")
            };

var result = query.ToList();

编辑:

或者,您可以将$filter部分编写为原始字符串,然后使用.Aggregate()方法。使用这种方法,您不必“映射”所有属性,但缺点是您正在失去类型安全性,因为这只是一个字符串,请尝试:

var addFields = BsonDocument.Parse("{ \"$addFields\": { myArray: { $filter: { input: \"$myArray\", as: \"m\", cond: { $eq: [ \"$$m.other\", \"stuff\" ] } }  } } }");

var query = Col.Aggregate()
               .Match(x => x._id == "1")
               .AppendStage<MyModel>(addFields);

$addFields 此处用于覆盖现有字段。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用C#驱动程序更新MongoDB中数组子文档中包含的数组子文档中的字段?

如何使用C#驱动程序更新MongoDB数组中的子文档

如何使用C#驱动程序删除mongodb文档中的嵌套数组元素

MongoDB C#驱动程序-更新嵌入式文档数组中的所有字段

C#MongoDB驱动程序:如何将新的子文档插入现有文档

如何在 C# Mongodb 强类型驱动程序中删除嵌套文档的数组内的元素

如何使用C#驱动程序在无类MongoDB上找到匹配的'StartsWith'文档

如何使用mongodb C#驱动程序获取子文档的集合?

使用C#.NET驱动程序2.0投影mongodb子文档

mongoDB c ++ 11驱动程序获取插入文档的ID

Mongodb C#驱动程序更新所有子数组元素

如何在MongoDB C#驱动程序中按值的字段范围选择文档?

如何从C#Mongodb强类型驱动程序中的文档中加载特定字段

使用C#驱动程序在mongodb中查找计算值最高的文档

复合查询以在MongoDb C#驱动程序中查找文档

C# MongoDb 驱动程序包含子对象

返回IAsyncCursor的MongoDB C#驱动程序Mock方法

Mongodb通过C#驱动程序使用多个字段匹配更新嵌入式文档

C#Mongodb驱动程序-如何在位置0的数组中插入元素

c# MongoDB 驱动程序,从嵌套数组中检索对象

使用C#驱动程序更新MongoDB中的多个数组项

在MongoDB C#驱动程序中获取生成的脚本

在Ubuntu中包含MongoDB C ++驱动程序时出错

mongodb c ++驱动程序无法更新

MongoDB C ++驱动程序问题

下载用于MongoDB的C ++驱动程序

C#mongodb驱动程序groupby

MongoDB C#驱动程序超时

MongoDB C#驱动程序CancellationToken