我目前在mongo中为我的应用程序设置了这样的对象(简化的示例,为了清晰起见,我删除了一些不相关的字段):
{
"_id" : ObjectId("529159af5b508dd71500000a"),
"c" : "somecontent",
"l" : [
{
"d" : "2013-11-24T01:43:11.367Z",
"u" : "User1"
},
{
"d" : "2013-11-24T01:43:51.206Z",
"u" : "User2"
}
]
}我想要做的是运行一个find查询,返回在"l“下具有最高数组长度的对象,并对最高->最低的对象进行排序,限制为25个结果。有些对象可能在数组中有一个对象,有些对象可能有100个。我想知道那些在"l“下面的人最多。我对mongo很陌生,在此之前,其他的东西都要处理,但我只是找不出正确的参数来获得这个特定的查询。我感到困惑的是如何处理数组的长度、排序等等。我可以通过解析集合中的所有内容来手动编写这段代码,但我确信,mongo必须有一种更有效的方法来做到这一点。我不反对学习,如果有人知道更高级查询的任何资源,或者可以帮助我,我真的很感激,因为这是最后一块!:)
顺便提一句,node.js和mongo在一起是很棒的,我希望我很久以前就开始使用它们了。
发布于 2013-11-24 09:40:09
使用聚合框架。下面是操作步骤:
db.collection.aggregate( [
{ $unwind : "$l" },
{ $group : { _id : "$_id", len : { $sum : 1 } } },
{ $sort : { len : -1 } },
{ $limit : 25 }
] )发布于 2013-11-24 02:30:11
对于现有的模式,没有一种简单的方法可以做到这一点。原因是mongodb中找不到数组长度的大小。是的,您有$size运算符,但是它的工作方式只是查找所有特定长度的数组。
因此,不能根据数组的长度对查找查询进行排序。唯一合理的出路是向模式中添加额外的字段,这将保留数组的长度(除了每个文档的字段外,还有类似于"l_length : 3“的内容)。好的是,您可以通过查看这个相关答案轻松地完成它,在此之后,您只需要确保在修改数组时增加或减少这个值。
当您添加这个字段时,您可以很容易地根据该字段对其进行排序,而且还可以利用索引。
发布于 2021-05-14 14:33:23
没有直接的方法来做这件事,
可以尝试使用$size在文档中添加“大小”字段,
$addFields添加新字段total以获取l数组中的总元素$sort由total按降序排列$limit$project移除total字段db.collection.aggregate([
{ $addFields: { total: { $size: "$l" } } },
{ $sort: { total: -1 } },
{ $limit: 25 }
// { $project: { total: 0 } }
])https://stackoverflow.com/questions/20170309
复制相似问题