我有这个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。)
答案 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]}
}
},