从限制为1(Node.js)的同一查询的mongo计数

时间:2018-11-08 14:07:06

标签: mongodb mongodb-query aggregation-framework

我的查询是:

public class OrderValueProviderFactory<T> : ValueProviderFactory where T : class
    {
        public override IValueProvider GetValueProvider(HttpActionContext actionContext)
        {
            var querystring = actionContext.Request.GetQueryNameValuePairs().ToDictionary(x => x.Key.ToLower(), x => x.Value);
            return new OrderValueProvider<T>(querystring);
        }
    }
    public class OrderValueProvider<T> : IValueProvider
    {
        readonly Dictionary<string, string> querystring;

        public OrderValueProvider(Dictionary<string, string> _querystring)
        {
            querystring = _querystring;
        }
        public bool ContainsPrefix(string prefix)
        {
            return true;
        }

        public ValueProviderResult GetValue(string key)
        {
            T obj = (T)Activator.CreateInstance(typeof(T));
            PropertyInfo[] properties = typeof(T).GetProperties();
            foreach (var property in properties)
            {
                if (property.PropertyType == typeof(string))
                {
                    property.SetValue(obj, querystring.GetStringValue(property.Name.ToLower()));
                }
                else if (property.PropertyType == typeof(DateTime?))
                {
                    property.SetValue(obj, querystring.GetDateTimeValue(property.Name.ToLower()));
                }
                else if (property.PropertyType == typeof(int))
                {
                    property.SetValue(obj, querystring.GetIntValue(property.Name.ToLower()));
                }
            }
            return new ValueProviderResult(obj, "", CultureInfo.InvariantCulture);
        }
    }

但我也执行相同的查询并获取计数结果(来自同一查询) 所以1个结果是最后一个限制为1的结果,第二个是没有限制的计数

我如何在MongoDB中做到这一点?

我想到的一个选项是执行相同的查询,但没有限制,例如,获取2000个结果并计入node.js代码。

我的节点代码:

 event.find({
    id:{$get:id},
    num:"5"
}).limit(1)

,但count始终返回1(因为count应该忽略id选项) 有可能吗?

示例:

请求是name = yy和id = 3

result = await this.collection.find({
    'val':obj.val,
    'id' : {$lt: id}
}).sort({id:-1}).limit(1).project({_id:0})  

let count  = await result.count()

另一个例子

结果将是:第2行(大于2的3)。计数= 2

1-  { id :3 , name:yy  },
2 - {id : 2 , name:yy}

结果将是:[] count = 1。 (没有id

1 个答案:

答案 0 :(得分:1)

您可以使用$facet

尝试进行以下汇总
result = await this.collection.aggregate([
  { "$facet": {
    "count": [
      { "$match": { "id": { "$lte": id }}},
      { "$count": "count" }
    ],
    "data": [
      { "$match": { "val": obj.val, "id" : id }},
      { "$sort": { "id": -1 }},
      { "$limit": 1 },
      { "$project": { "_id": 0 }}
    ]
  }}
]) 

result = result[0].data
const count  = result[0].count