Mongo:匹配聚合查询中的日期似乎被忽略

时间:2013-02-22 12:35:54

标签: mongodb aggregation-framework

我正在尝试在我的mongo db中运行聚合语句。我有一份文件,其结构(至少)如下:

{
   "_id": ObjectId,
   "date": ISODate,
   "keywordGroupId": NumberLong,
   "ranking": NumberLong,
}

我想运行一个汇总语句,汇总给定'keywordGroupId'和给定'date'区间的'ranking'字段。

我一直在尝试使用以下聚合命令:

{ 
    aggregate : "KeywordHistory", 
    pipeline : [
        { $match: { keywordGroupId: 75 , "$date": {$gte: ISODate("2013-01-01T00:00:00.0Z"), $lt: ISODate("2013-02-01T00:00:00.0Z")}} },
        { $group: { _id: { null }, count: { $sum: "$ranking" } } }
    ]
}

此命令执行时没有错误并返回结果。如果我尝试更改'keywordGroupId'字段的值,则该命令返回不同的值,因此我假设$ match语句适用于该字段(NumberLong)。但是,如果我更改'date'范围并且我指定了数据库中没有任何数据的时间间隔,它仍然会返回一个结果(我实际上会期望一个空的结果集)。所以我必须假设$ match语句忽略指定的日期间隔。

有人能帮助我吗?

3 个答案:

答案 0 :(得分:9)

删除$的{​​{1}}字段中的$date前缀:

$match

您只在字段名称用于值时使用{ $match: { keywordGroupId: 75, date: {$gte: ISODate("2013-01-01T00:00:00.0Z"), $lt: ISODate("2013-02-01T00:00:00.0Z")} }}, 前缀,而不是键。

答案 1 :(得分:4)

有时ISodate不起作用。所以如果你想只使用"一个"匹配日期。约会的最佳方式是:---

例如: - 让架构为:---

    public interface IRepository<TEntity> where TEntity : class
    {
        TEntity Get(int id);
        void Add(TEntity entity);
    }

...

    public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
    {
        protected readonly DbContext Context;

        public Repository(DbContext context)
        {
            Context = context;
        }

        public TEntity Get(int id)
        {
            // Here we are working with a DbContext, not PlutoContext. So we don't have DbSets 
            // such as Courses or Authors, and we need to use the generic Set() method to access them.
            //Returns a non-generic DbSet instance for access to entities of the given type in the context and the underlying store .
            return Context.Set<TEntity>().Find(id);
        }

        public void Add(TEntity entity)
        {
            Context.Set<TEntity>().Add(entity);
        }
    }
.................................

    public interface IAuthorRepository : IRepository<Author>
    {
        Author GetAuthorWithCourses(int id);
    }
..

    public class AuthorRepository : Repository<Author>, IAuthorRepository
    {
        public AuthorRepository(PlutoContext context) : base(context)
        {
        }

        public Author GetAuthorWithCourses(int id)
        {
            return PlutoContext.Authors.Include(a => a.Courses).SingleOrDefault(a => a.Id == id);
        }

        public PlutoContext PlutoContext
        {
            get { return Context as PlutoContext; }
        }
    }
..


    public interface IUnitOfWork : IDisposable
    {
        IAuthorRepository Authors { get; }
        int Complete();
    }
...

  public class UnitOfWork : IUnitOfWork
    {
        private readonly PlutoContext _context;

        public UnitOfWork(PlutoContext context)
        {
            _context = context;
           Authors = new AuthorRepository(_context);
        }

        public IAuthorRepository Authors { get; private set; }

        public int Complete()
        {
            return _context.SaveChanges();
        }

        public void Dispose()
        {
            _context.Dispose();
        }
    }


...

        public class Repository<Entity> : IRepository<Entity> where Entity : class
        {
        protected readonly DbContext Context;

        public Repository(DbContext context)
        {
            Context = context;
        }


        public void Add(Entity entity)
        {
            Context.Set<TEntity>().Add(entity);
        }
    }

});

var storeOrder = new Schema({
store_name:{type:String, required:true},
date :{type:Date ,default:moment(new Date()).format('YYYY-MM-DD')},
orders : [{
vegetable : String,
quantity : Number,
price:Number
 }]

现在通过匹配日期聚合: -

mongoose.model('storeorder',storeOrder);

**必须使用storeOrder.aggregate([$match:{date :new Date("2016-12-26T00:00:00.000Z")} ]) 代替new Date("2016-12-26T00:00:00.000z")

谢谢你

答案 2 :(得分:0)

聚合需要一个 Javascript 日期对象,否则不起作用。

<块引用>
new Date();
new Date(year, month, day);

请注意月份以 0 而非 1 开头(您的一月是 0 和 12 月 11)