Mongodb发现数组长度大于指定大小

时间:2017-01-29 07:30:05

标签: node.js mongodb mongoose

我有这个Mongoose模型架构

const postSchema = new Schema({

  title: String,

  headline: [{
    kind: String,
    id: Schema.Types.ObjectId,
    content: String,
    relevance: Number,
    _id: false
  }],

});

我想在数据库中找到headline数组长度大于x

的模型

我有这个问题:

 const query = {
        'headline.kind': 'topic',
        'headline.id': topicId,
        'headline':{
            '$size':{
                '$gt': x
            }
        }
    };

但是当我使用它时,我得到:

 { MongooseError: Cast to number failed for value "{ '$gt': 2 }" at path "headline"
    at CastError (/home/oleg/WebstormProjects/lectal/api/node_modules/mongoose/lib/error/cast.js:26:11)

任何人都知道构建此查询的正确方法吗? (在我的代码中,我只是将数字2硬编码为x。)

3 个答案:

答案 0 :(得分:4)

以最有效的方式,您可以使用"dot notation"通过指定n位置。这基本上是说一个阵列至少有"至少" n + 1元素然后返回它。

因此,而不是写{ "$gt": 2 }而不是寻找"第三"的索引值的存在。元素(从零指数第三是2):

{ "headline.2": { "$exists": true } }

$exists运算符正在查找该给定索引处元素的存在,并且当条件满足时,该数组必须至少为该长度,因此"大于2&#34 ;

同时注意到您的查询条件需要匹配数组元素上的多个属性,为此您实际使用$elemMatch,否则条件实际适用于匹配任何数组中的元素,而不仅仅是"两者中的元素"条件为$elemMatch

{
  "headline": { "$elemMatch": { "kind": "topic", "id": topicId } },
  "headline.2": { "$exists": true }
}

要做到这一点"动态",我们只是构建从参数生成密钥的查询:

const query = {
  "headline": { "$elemMatch": { "kind": "topic", "id": topicId } }
};

query['headline.'+x] = { "$exists": true }

答案 1 :(得分:2)

根据我的阅读,使用$gt$where无法做到这一点。

尝试使用hostname -i hostname -I ls /sys/class/net ip -f inet addr show eth0| grep -Po 'inet \K[\d.]+' - view-source:https://www.facebook.com/

答案 2 :(得分:1)

$expr:{$gte: [{$size: "$preferredArray"}, specifiedsize]}

如果您正在使用汇总,它会更好,更快;整个查询如下所示:

db.collection.aggregate([
 
  {
      $match: {
          preferred criteria:1,
          $expr:{$gte: [{$size: "$diagnosis"}, 2]}
      }
          
      
  },