代码之家  ›  专栏  ›  技术社区  ›  Daniel Haefliger

mongodb/c过滤并获取所有子文档

  •  0
  • Daniel Haefliger  · 技术社区  · 8 年前

    我使用的文档

    public class Customer
    {
        public ObjectId Id { get; set; }
    
        public int CustomerId { get; set; }
    
        public List<Address> Addresses { get; set; }
    }
    
    public class Address
    {
        public string Name { get; set; }
    }
    

    {
        CustomerId: 2,
        Addresses: [
            {
                Name: "Daniel"
            },
            {
                Name: "Eric"
            },
            {
                Name: "Dan"
            }
            ]
    }
    

    var mdb = mongoClient.GetDatabase("test");
    var collection = mdb.GetCollection<WebApi>("Customer");
    var builder = Builders<Customer>.Filter;
    var searchTerm = "Dan";
    

    当像这样查询时,它可以工作,但它保存所有地址:

    var filter = builder.And(builder.Eq("InstallationId", 2),
                             builder.Regex("Addresses.Name", new BsonRegularExpression(".*" + searchTerm + ".*", "i")))
    var result = collection.Find(filter).FirstOrDefault();
    

    [
        {
            Name: "Daniel"
        },
        {
            Name: "Dan"
        }
    ]
    

    {
        CustomerId: 2,
        Addresses: [
            {
                Name: "Daniel"
            },
            {
                Name: "Dan"
            }
            ]
    }
    

    collection.AsQueryable().Where(x => x.CustomId == 2).SelectMany(x =>
                    x.Addresses.Where(a => a.Name.IndexOf(searchTerm, StringComparison.InvariantCultureIgnoreCase) >= 0).ToList();
    

    1 回复  |  直到 8 年前
        1
  •  2
  •   dnickless    8 年前

    这应该让你去:

    var result = collection
        .Aggregate()
        .Match(c => c.CustomerId == 2)
        .Project(c => new
            {
                c.CustomerId,
                Addresses = c.Addresses.Where(a => a.Name.IndexOf(searchTerm) != -1)
            })
        .ToList();
    

    db.Customer.aggregate([{
        $match: { CustomerId: 2 }
    }, {
        $project: {
            CustomerId: "$CustomerId",
            Addresses: {
                $filter: {
                    input: "$Addresses",
                    as: "a",
                    cond: {
                        $ne: [ { $indexOfBytes: [ "$$a.Name", "Dan" ] }, -1 ]
                    }
                }
            },
            _id: 0
        }
    }])
    

    https://jira.mongodb.org/browse/SERVER-11947 ToUpper()

    var result = collection
        .Aggregate()
        .Match(c => c.CustomerId == 2)
        .Project(c => new
            {
                c.CustomerId,
                Addresses = c.Addresses.Where(a => a.Name.ToUpper().IndexOf(searchTerm.ToUpper()) != -1)
            })
        .ToList();