Фильтрация mongodb фильтр сбора данных - PullRequest
1 голос
/ 22 июня 2019

Я использовал mongodb в своем бэкэнде для хранения личной информации клиентов, и мне нужно выбрать пользователя в возрасте 30, 32 и 35 лет.

Я пробовал ниже способы получить, но он возвращает ноль результатов, и я использовал C # MongoDB.Driver

код C #

Age = new string[] { "26-30", "31-35" }
DateTime today = DateTime.Today;
var filter = Builders<Customer>.Filter.Empty;
foreach (var item in searchFilterBlock.Age)
 {
    var ageBetween = item.Split('-');
    int.TryParse(ageBetween[0], out int startYear);
    int.TryParse(ageBetween[1], out int endYear);
    var start = today.AddYears(-startYear);
    var end = today.AddYears(-endYear); 
    filter = filter & (Builders<Customer>.Filter.Gte(x => x.Dob, start)
                        & Builders<Customer>.Filter.Lte(x=>x.Dob, end));
 }
// to execute the filter
var searchResult = _context.Customer.Find(filter).ToList(); // it return 0 result

Нужно получить, кто имеет возраст 30, 32 и 35 лет.

1 Ответ

0 голосов
/ 22 июня 2019

Вы можете получить клиентов в возрасте 30,32 и 35 лет с помощью фильтра $or, например:

db.Customer.find({
    "$or": [
        {
            "DOB": {
                "$lte": ISODate("1989-06-22T14:57:50.168Z"),
                "$gte": ISODate("1988-06-22T14:57:50.168Z")
            }
        },
        {
            "DOB": {
                "$lte": ISODate("1987-06-22T14:57:50.168Z"),
                "$gte": ISODate("1986-06-22T14:57:50.168Z")
            }
        },
        {
            "DOB": {
                "$lte": ISODate("1984-06-22T14:57:50.168Z"),
                "$gte": ISODate("1983-06-22T14:57:50.168Z")
            }
        }
    ]
})

вот код c #, который сгенерировал приведенный выше запрос поиска с помощью вспомогательной библиотеки MongoDB.Entities [заявление об отказе: я автор]

using MongoDB.Driver;
using MongoDB.Entities;
using System;
using System.Collections.Generic;

namespace StackOverflow
{
    public class Program
    {
        public class Customer : Entity
        {
            public string Name { get; set; }
            public DateTime DOB { get; set; }
        }

        private static void Main(string[] args)
        {
            new DB("test");

            (new[] {
                new Customer{ Name = "I am 29", DOB = DateTime.UtcNow.AddYears(-29)},
                new Customer{ Name = "I am 30", DOB = DateTime.UtcNow.AddYears(-30)},
                new Customer{ Name = "I am 32", DOB = DateTime.UtcNow.AddYears(-32)},
                new Customer{ Name = "I am 35", DOB = DateTime.UtcNow.AddYears(-35)},
                new Customer{ Name = "I am 36", DOB = DateTime.UtcNow.AddYears(-36)}
            }).Save();

            var ages = new[] { 30, 32, 35 };

            var filters = new List<FilterDefinition<Customer>>();

            foreach (var age in ages)
            {
                var start = DateTime.UtcNow.AddYears(-age);
                var end = DateTime.UtcNow.AddYears(-age - 1);
                filters.Add(DB.Filter<Customer>()
                              .Where(c => c.DOB <= start && c.DOB >= end));
            }

            var customers = DB.Find<Customer>()
                              .Many(f => f.Or(filters))
                              .ToArray();
        }
    }
}
...