在MongoDB中,使用$type,可以根据字段是否与BSON数据类型匹配来过滤搜索(请参阅DOCS).
例如.
db.posts.find({date2: {$type: 9}}, {date2: 1})
Run Code Online (Sandbox Code Playgroud)
返回:
{
"_id" : ObjectId("4c0ec11e8fd2e65c0b010000"),
"date2" : "Fri Jul 09 2010 08:25:26 GMT"
}
Run Code Online (Sandbox Code Playgroud)
我需要一个查询,告诉我该字段的实际类型是什么,对于集合中的每个字段.这可能与MongoDB有关吗?
我在Mongo有一套文件.说:
[
{ summary:"This is good" },
{ summary:"This is bad" },
{ summary:"Something that is neither good nor bad" }
]
Run Code Online (Sandbox Code Playgroud)
我想计算每个单词的出现次数(不区分大小写),然后按降序排序.结果应该是这样的:
[
"is": 3,
"bad": 2,
"good": 2,
"this": 2,
"neither": 1,
"nor": 1,
"something": 1,
"that": 1
]
Run Code Online (Sandbox Code Playgroud)
知道怎么做吗?聚合框架将是首选,因为我已经在某种程度上理解它:)
好吧,仍然在我的玩具应用程序中,我想找出一组车主的里程表的平均里程数.这在客户端非常简单,但不能扩展.对?但是在服务器上,我并没有完全看到如何实现它.
问题:
@HubertOG的建议是使用Meteor.call,这是有意义的,我这样做:
# Client side
Template.mileage.average_miles = ->
answer = null
Meteor.call "average_mileage", (error, result) ->
console.log "got average mileage result #{result}"
answer = result
console.log "but wait, answer = #{answer}"
answer
# Server side
Meteor.methods average_mileage: ->
console.log "server mileage called"
total = count = 0
r = Mileage.find({}).forEach (mileage) ->
total += mileage.mileage
count += 1
console.log "server about to return #{total / count}"
total / count
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但它并不是因为尽可能接近Meteor.call是异步调用,并且answer将始终为null返回.处理服务器上的东西似乎是一个常见的用例,我必须忽略一些东西.那会是什么?
谢谢!
我们的系统是运营商级并且非常强大,它经过负载测试以处理每秒5000个事务,并且对于每个事务,文档被插入到单个MongoDB集合中(在此应用程序中没有更新或查询,它是只写的).这相当于每天约700MM的文件,这是我们的基准.
MongoDB部署尚未分片,我们有1x replicaset,1个master和2个slave,所有这些都是ec2上的m2.2xlarge类型.每个实例都由1TB RAID0条带支持,该条带由8个卷组成(无PIOPS).我们使用带有c ++本机BSON解析器的node-mongodb-native驱动程序来获得最佳写入性能,并尝试相应地对文档结构建模.
{
_id: ObjectID(),
a: ‘string’,
b: ‘string’,
c: ‘string’ or <int>,
g: ‘string’ or <not_exist>,
t: ISODate(),
h: <int>,
d: <int>,
m: <int>,
y: <int>
}
Run Code Online (Sandbox Code Playgroud)
col.ensureIndex({ c: 1, a: 1, y: 1, m: 1, d: 1, h: 1 });
Run Code Online (Sandbox Code Playgroud)
col.aggregate([
{ $match: { c: 'customer_1', y: 2013, m: 11 } },
{ $group: { _id: …Run Code Online (Sandbox Code Playgroud) 我想根据字段对所有文档进行分组,但是要限制为每个值分组的文档数.
每条消息都有一个conversation_ID.我需要为每个conversation_ID获取10或更少数量的消息.
我可以根据以下命令进行分组,但除了切片结果之外,无法弄清楚如何限制分组文档的数量
Message.aggregate({'$group':{_id:'$conversation_ID',msgs:{'$push':{msgid:'$_id'}}}})
如何将每个conversation_ID的msgs数组的长度限制为10?
database mongoose mongodb mongodb-query aggregation-framework
MongoDB中输出格式的聚合函数有多灵活?
数据格式:
{
"_id" : ObjectId("506ddd1900a47d802702a904"),
"port_name" : "CL1-A",
"metric" : "772.0",
"port_number" : "0",
"datetime" : ISODate("2012-10-03T14:03:00Z"),
"array_serial" : "12345"
}
Run Code Online (Sandbox Code Playgroud)
现在我正在使用这个聚合函数来返回DateTime数组,一个指标数组和一个计数:
{$match : { 'array_serial' : array,
'port_name' : { $in : ports},
'datetime' : { $gte : from, $lte : to}
}
},
{$project : { port_name : 1, metric : 1, datetime: 1}},
{$group : { _id : "$port_name",
datetime : { $push : "$datetime"},
metric : { $push : "$metric"},
count : { $sum : …Run Code Online (Sandbox Code Playgroud) 我正在评估MongoDB聚合框架如何满足我们的需求,因为我们当前正在SQL Server上运行.我很难执行特定查询:
假设我有以下伪记录(在sql表中建模为列,在mongodb集合中建模为完整文档)
{
name: 'A',
timespent: 100,
},
{
name: 'B',
timespent: 200,
},
{
name: 'C',
timespent: 300,
},
{
name: 'D',
timespent: 400,
},
{
name: 'E',
timespent: 500,
}
Run Code Online (Sandbox Code Playgroud)
我想将timepent字段分组到范围并计算出现次数,以便我得到例如以下伪记录:
results{
0-250: 2,
250-450: 2,
450-650: 1
}
Run Code Online (Sandbox Code Playgroud)
请注意,这些范围(250,450和650)是动态的,并且可能会被用户随时间改变.在SQL中,我们使用以下内容提取结果:
select range, COUNT(*) as total from (
select case when Timespent <= 250 then '0-250'
when Timespent <= 450 then '200-450'
else '450-600' end as range
from TestTable) as r
group by r.range
Run Code Online (Sandbox Code Playgroud)
再次注意,这个sql是由我们的应用程序动态构建的,以适应任何时候可用的特定范围.
我正在努力在mongodb聚合框架中找到适当的构造来执行此类查询.我可以通过在管道中插入$ match来查询单个范围的结果(即获取单个范围的结果),但我不知道如何在单个管道查询中提取所有范围及其计数.
在MongoDB投影中,有没有办法指定一些新字段(但同时保留输入到管道投影阶段的字段)?我没有重命名现有的任何字段.
因此,如果我从一个具有'field1'和'field2'的集合开始,并执行以下投影:
{ $project: { field3: { $gt: ['$field1', 10] } } }
Run Code Online (Sandbox Code Playgroud)
我想最终将'field1','field2'和'field3'作为输入提供给下一个阶段,或者从聚合框架输出.
我试图通过排除_id将投影置于排除模式,但这不起作用.
我想从MongoDB聚合中的组管道中获取百分比.
我的数据:
{
_id : 1,
name : 'hello',
type : 'big'
},
{
_id : 2,
name : 'bonjour',
type : 'big'
},
{
_id : 3,
name : 'hi',
type : 'short'
},
{
_id : 4,
name : 'salut',
type : 'short'
},
{
_id : 5,
name : 'ola',
type : 'short'
}
Run Code Online (Sandbox Code Playgroud)
我的请求组按类型和计数:
[{
$group : {
_id : {
type : '$type'
},
"count" : {
"$sum" : 1
}
}
}]
Run Code Online (Sandbox Code Playgroud)
结果:
[ …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的$lookup聚合查询,如下所示:
{'$lookup':
{'from': 'edge',
'localField': 'gid',
'foreignField': 'to',
'as': 'from'}}
Run Code Online (Sandbox Code Playgroud)
当我在匹配足够的文档时运行它时,我收到以下错误:
Command failed with error 4568: 'Total size of documents in edge
matching { $match: { $and: [ { from: { $eq: "geneDatabase:hugo" }
}, {} ] } } exceeds maximum document size' on server
Run Code Online (Sandbox Code Playgroud)
所有限制文件数量的尝试都失败了.allowDiskUse: true什么也没做.发送输入cursor无效.添加$limit到聚合中也会失败.
怎么会这样?
然后我再次看到错误.哪里是$match和$and与$eq从何而来?幕后的聚合管道是否会$lookup调用另一个聚合,一个是自己运行的聚合管道,我无法为游标提供限制或使用游标.
这里发生了什么?