我目前在我的应用程序中为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"
}
]
}
我想要做的是运行查询查询以返回在“l”下具有最高数组长度的对象,并将最高 - >最低,排序限制为25个结果。有些对象可能在数组中有1个对象,有些可能有100个。我想找出哪些对象在“l”下最多。我是mongo的新手,并且到目前为止还得到了其他所有工作,但我无法找出正确的参数来获得这个特定的查询。我感到困惑的是如何处理计算数组的长度,排序等。我可以通过解析集合中的所有内容来手动编码,但我确信mongo必须有一种方法来做到这一点。更有效率。我不反对学习,如果有人知道任何更高级的查询资源或者可以帮助我,我真的很感激,因为这是最后一块! : - )
作为旁注,node.js和mongo在一起很棒,我希望我很久以前就开始使用它们了。
答案 0 :(得分:16)
使用聚合框架。方法如下:
db.collection.aggregate( [
{ $unwind : "$l" },
{ $group : { _id : "$_id", len : { $sum : 1 } } },
{ $sort : { len : -1 } },
{ $limit : 25 }
] )
答案 1 :(得分:1)
使用现有架构没有简单的方法。原因是mongodb中没有任何内容可以找到数组长度的大小。是的,你有$size运算符,但它的工作方式只是找到特定长度的所有数组。
因此,您无法根据数组的长度对查询查询进行排序。唯一合理的方法是在模式中添加额外的字段,该字段将保存数组的长度(对于每个文档,除了字段之外,还有“l_length:3”之类的东西)。好的是你可以通过查看这个relevant answer轻松地完成它,之后你只需要确保在修改数组时增加或减少这个值。
当您添加此字段时,您可以轻松地按该字段对其进行排序,而且您可以利用索引。
答案 2 :(得分:0)
没有直接的方法可以做到这一点,
您可以尝试使用 $size
,
$addFields
添加新字段 total
以获取 l
数组中的总元素$sort
按 total
降序排列$limit
选择单个文档$project
在不需要时删除 total
字段db.collection.aggregate([
{ $addFields: { total: { $size: "$l" } } },
{ $sort: { total: -1 } },
{ $limit: 25 }
// { $project: { total: 0 } }
])