- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
1条记录(社区)的表示:
{
"_id" : ObjectId("538a4734d6194c0e98000001"),
"name" : "Darko",
"description" : "Darko",
"subdomain" : "darko",
"domain" : "forum.dev",
"created" : ISODate("2014-05-31T21:18:44.764Z"),
"category" : "Art and Culture",
"owner" : "53887456d6194c0f5b000001",
"members" : [
"53887456d6194c0f5b000001"
]
}
和 Go 类型
Community struct {
Id bson.ObjectId `bson:"_id,omitempty" json:"id"`
Name string `json:"name"`
Description string `bson:",omitempty" json:"description"`
Subdomain string `bson:",omitempty" json:"subdomain"`
Domain string `json:"domain"`
Created time.Time `json:"created"`
Category string `json:"category"`
Owner string `json:"owner"`
Banned []string `bson:",omitempty" json:"banned"`
Members []string `json:"members"`
Moderators []string `bson:",omitempty" json:"moderators"`
Admins []string `bson:",omitempty" json:"admins"`
Logo string `bson:",omitempty" json:"logo"`
Stylesheets []string `bson:",omitempty" json:"stylesheets"`
Javascripts []string `bson:",omitempty" json:"javascripts"`
}
现在我想检索类别
艺术与文化
的所有社区的列表,并按成员数量排序,也就是members.length
在 js 或 len(Community.Members)
在 Go.
类似SELECT * FROM communities ORDER BY COUNT(members) WHERE category = 'Art and Culture'
我有一个自定义类型要填充或解码
CommunityDirectory struct {
Id bson.ObjectId `bson:"_id,omitempty" json:"id"`
Name string `json:"name"`
Description string `bson:",omitempty" json:"description"`
Subdomain string `bson:",omitempty" json:"subdomain"`
Domain string `json:"domain"`
Created time.Time `json:"created"`
Category string `json:"category"`
Logo string `bson:",omitempty" json:"logo"`
Membercount int64 `bson:"membercount" json:"membercount"`
}
到目前为止我有什么
func (ctx *CommunityContext) Directory() {
pipe := ccommunity.Pipe([]bson.M{bson.M{"membercount": bson.M{"$size": "members"}}})
iter := pipe.Iter()
result := CommunityDirectory{}
results := []CommunityDirectory{}
for {
if iter.Next(&result) {
results = append(results, result)
fmt.Println(result)
} else {
break
}
}
ctx.JSON(results)
}
但这行不通,因为
db.communities.aggregate(
[
{"membercount": {$size:"members"}}
]
)
Error("Printing Stack Trace")@:0
()@src/mongo/shell/utils.js:37
([object Array])@src/mongo/shell/collection.js:866
@(shell):3
uncaught exception: aggregate failed: {
"errmsg" : "exception: Unrecognized pipeline stage name: 'membercount'",
"code" : 16436,
"ok" : 0
}
因此,它应该找到所有内容,按成员数排序并分配一个新的“虚拟”字段成员数,但仅限于“艺术与文化”类别。
我发现 MongoDB 在这方面相当复杂。
mongodb 查询是什么样的?
在 Go/mgo 中它看起来像什么?
最佳答案
当你刚接触聚合框架时,有几个概念需要习惯
管道在 shell 中的正确形式应该是这样的:
db.communties.aggregate([
// Match the documents first to filter and possibly make use of an index
{ "$match": {
"category": "Art and Culture"
}},
// You include all fields when adding another and you want all
{ "$project": {
"name": 1,
"description": 1,
"subdomain": 1,
"domain": 1,
"created": 1,
"category": 1,
"owner": 1,
"members": 1,
"memberCount": { "$size": "$members" }
}},
// $sort means "ORDER BY" in this case the ascending
{ "$sort": { "memberCount": 1 } },
// Optionally project just the fields you need in the result
{ "$project": {
"name": 1,
"description": 1,
"subdomain": 1,
"domain": 1,
"created": 1,
"category": 1,
"owner": 1,
"members": 1
}}
])
因此,除非您根本不想改变结构,否则确实没有“SELECT *”的直接等价物。在这里你需要添加一个字段“memberCount”所以你需要指定所有的字段。您可以使用 $$ROOT
它复制文档中的所有字段,但您需要将其分配给 $project
中的另一个字段/属性,例如:
{ "$project": {
"_id": "$$ROOT",
"memberCount": 1
}}
但是现在您所有的“字段”当然都与它们不完全相同,并且都以 _id.
为前缀。但这是个人品味问题。
接下来要习惯的就是总是尝试使用 $match
第一的。这不仅有助于减少在聚合管道的其余部分操作的文档,这也是您使用索引优化查询的唯一机会。一旦您用其他阶段修改文档,使用索引就结束了,因为这不再是被索引的原始来源。实际上与 SQL 并没有太大区别,但语义在您指定的方式上有所不同。请记住,“管道”就像一个 Unix“管道”|
运算符,所以先进行“匹配”。
排序有它自己的流水线阶段。所以使用 $sort
管道阶段的运算符(operator)来执行此操作。
决赛$project
是可选的。这里我们只是丢弃了用于“排序”的“memberCount”字段。
mGo 的用法应该是这样的:
pipeline := [].bson.D{
bson.M{"$match": bson.M{ "category": "Art and Culture" } },
bson.M{"$project": bson.M{
"name": 1,
"description": 1,
"subdomain": 1,
"domain": 1,
"created": 1,
"category": 1,
"owner": 1,
"members": 1,
"memberCount": bson.M{ "$size": "$members" }
}},
bson.M{ "$sort": bson.M{ "memberCount": 1 } },
bson.M{ "$project": bson.M{
"name": 1,
"description": 1,
"subdomain": 1,
"domain": 1,
"created": 1,
"category": 1,
"owner": 1,
"members": 1
}}
}
pipe := ccommunity.Pipe( pipeline )
所以实际上与您会发现的大多数示例的形式没有什么不同。
可能看看SQL to aggregation Mapping Chart核心文档中提供了其他适用于聚合管道的常见 SQL 查询示例。
关于mongodb - mgo/mongodb : aggregate - find all and order by membercount however membercount is an array of member userids,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983902/
在 C 中: int a[10]; printf("%p\n", a); printf("%p\n", &a[0]); 产量: 0x7fff5606c600 0x7fff5606c600 这是我所期望
我一直在尝试运行此循环来更改基于数组的元素的位置,但出现以下错误。不太确定哪里出了问题。任何想法或想法!谢谢。 var population = [[98, 8, 45, 34, 56], [9, 1
我正在尝试获取一个 Ruby 数组数组并将其分组以计算其值。 数组有一个月份和一个 bool 值: array = [["June", false], ["June", false], ["June"
所以我们的目标是在遇到某个元素时将数组分割成子数组下面的示例 array.split("stop here") ["haii", "keep", "these in the same array bu
在this问题已经回答了两个表达式是相等的,但在这种情况下它们会产生不同的结果。对于给定的 int[] 分数,为什么会这样: Arrays.stream(scores) .forEac
我认为我需要的是哈希数组的数组,但我不知道如何制作它。 Perl 能做到吗? 如果是这样,代码会是什么样子? 最佳答案 perldoc perldsc是了解 Perl 数据结构的好文档。 关于arra
我遇到了这个问题,从 API 中我得到一个扩展 JSON,其中包含一个名为坐标的对象,该对象是一个包含数组 o 数组的数组。 为了更清楚地看这个例子: "coordinates": [
postgres 中有(v 9.5,如果重要的话): create table json_test( id varchar NOT NULL, data jsonb NOT NULL, PRIM
我用 echo "${array[@]}" 和 echo "${array[*]}" 得到了相同的结果。 如果我这样做: mkdir 假音乐; touch fakemusic/{Beatles,Sto
我正在尝试创建 typealias 对象的数组数组 - 但我收到“表达式类型不明确,没有更多上下文”编译错误。这是我的代码: typealias TestClosure = ((message: St
如果您在 Python 中创建一维数组,使用 NumPy 包有什么好处吗? 最佳答案 这完全取决于您打算如何处理数组。如果您所做的只是创建简单数据类型的数组并进行 I/O,array模块就可以了。 另
当我将数组推送到只有一个数组作为其唯一元素的数组数组时,为什么会得到这种数据结构? use v6; my @d = ( [ 1 .. 3 ] ); @d.push( [ 4 .. 6 ] ); @d.
在 Julia 中,我想将定义为二维数组向量的数据转换为二维矩阵数组。 如下例所述,我想把数据s转换成数据t,但是至今没有成功。 我该如何处理这个案子? julia> s = [[1 2 3], [4
C 没有elementsof 关键字来获取数组的元素数。所以这通常由计算 sizeof(Array)/sizeof(Array[0]) 代替但这需要重复数组变量名。1[&Array] 是指向数组后第一
所以,假设我有一个像这样的(愚蠢的)函数: function doSomething(input: number|string): boolean { if (input === 42 || in
我有以下数组: a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] 我将它用于一些像这样的视觉内容: 1 2 3 4 5 6 7 8 9 10
我想知道数组中的 .toList 与 .to[List] 之间有什么区别。我在spark-shell中做了这个测试,结果没有区别,但我不知道用什么更好。任何意见? scala> val l = Arr
我很难获得完全相同对象的多个元素的当前元素索引: $b = "A","D","B","D","C","E","D","F" $b | ? { $_ -contains "D" } 替代版本: $b =
我正在尝试使用来自我的 API 的 v-select 执行 options,我将数据放在数组数组中。 Array which I got from API 它应该是一个带有搜索的 select,因为它
这个问题在这里已经有了答案: String literals: pointer vs. char array (1 个回答) 4 个月前关闭。 当我执行下一个代码时 int main() {
我是一名优秀的程序员,十分优秀!