Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb查询:$size with$gt始终返回0_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

mongodb查询:$size with$gt始终返回0

mongodb查询:$size with$gt始终返回0,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想知道在mongodb查询中如何实现数组大小的不平等 例如,我有以下两个查询: > db.userStats.count({sessions:{$size:1}}) 1381 > db.userStats.count({sessions:{$size:{$gt:0}}}) 0 如果$gt按照我的意愿工作,则第二次查询的结果将不同,导致数字至少为1381 第二个查询有什么问题,我如何修复它以获得我想要的结果 谢谢您不能这样做,因为您的文档中实际提到了这一点。因此,运算符单独计算“文

我想知道在mongodb查询中如何实现数组大小的不平等

例如,我有以下两个查询:

> db.userStats.count({sessions:{$size:1}})
1381
> db.userStats.count({sessions:{$size:{$gt:0}}})
0
如果
$gt
按照我的意愿工作,则第二次查询的结果将不同,导致数字至少为1381

第二个查询有什么问题,我如何修复它以获得我想要的结果


谢谢

您不能这样做,因为您的文档中实际提到了这一点。因此,运算符单独计算“文字”结果,不能与“范围运算符”一起使用,如您所要求的

您唯一的实际选择是通过使用运算符否定条件来请求“不等于0”的“大小”。这是完全正确的:

db.userStats.count({“sessions”:{“$not”:{“$size”:0}});
或者使用聚合框架中的其他版本进行测试,只要您的MongoDB版本为2.6或更高版本:

db.userStats.aggregate([
{“$组”:{
“_id”:空,
“计数”:{
“$sum”:{
“$cond”:[
{“$gt”:[{“$size”:“$sessions”,0}]},
1.
0
]
}
}
}}
])
也可能采用JavaScript评估的形式:

db.userStats.count(函数(){返回this.sessions.length>0});
但可能比上一版本慢

或者事实上,您可以通过操作员执行此操作:

db.userStats.count({“sessions.0”:{“$exists”:true});
一般的想法是,如果索引
0
处有一个元素,那么数组就有一定的长度

这完全取决于你的方法,但这些形式中的任何一种都会得到正确的结果

但是为了从MongoDB获得“最佳”性能,不要使用这些方法中的任何一种。相反,将数组“length”保留为正在检查的文档的属性。这样您就可以“索引”,并且发出的查询实际上可以访问该索引,而上面的任何一个都无法访问该索引

保持这样:

db.userStats.update(
{“_id”:docId,“sessions”:{“$ne”:newItem},
{
“$push”:{“sessions”:newItem},
“$inc”:{“countSessions”:1}
}
)
或删除:

db.userStats.update(
{u id:docId,“sessions:newItem},
{
“$pull”:{“sessions”:newItem},
“$inc”:{“countSessions”:-1}
}
)
然后,您只需查询“CountSessions”,它也可以索引以获得最佳性能:

db.userStats.find({“countSessions”:{“$gt”:0})

这是最好的方法。

$size不接受值的范围。看

要为值的范围(例如从1到3)选择$size,可以使用$or

db.userStats.count( { $or: [ {sessions:{$size:1}}, {sessions:{$size:2}}, {sessions:{$size:3}} ] } )
当然,$or是一个有效但不好的解决方案。按照MongoDB的建议去做:

根据具有不同编号的字段选择文档的步骤 元素,创建一个计数器字段,在添加时递增该字段 元素添加到字段中


嗯,这似乎是MongodBac的一个非常严重的限制实际上,
{$gt:0}
只是一个例子,我指的是一个可参数化的例子,所以不幸的是,针对0案例的特别解决方案不够好。问题是我有一个自动生成查询的系统,用于
find
。在看到mongo的这种局限性后,不等式的实现变得依赖于上下文,这将使我的代码更加复杂。有趣您关于
$exists
的建议很难理解。@francescostablum有趣的是,我注意到文档似乎已经更改,之前有一句话说诸如
$gt
或其他相等运算符等运算符不能同时工作。嗯,主要的疏忽。但也值得一提的是,这些操作符中没有一个能够通过使用“索引”从这样的查询中获得最佳性能。因此,如果经常需要这样做,“推荐”的方法是在文档中保留一个字段,用于“跟踪”数组长度。我会更新一些关于这个的更多信息。