我正在aggregation result exceeds maximum document size (16MB)使用pymongo进行mongodb聚合的错误.
我首先使用该limit()选项克服了它.但是,在某些时候我得到了
Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in." error.
Run Code Online (Sandbox Code Playgroud)
好的,我会用这个{'allowDiskUse':True}选项.当我在命令行上使用它时,此选项有效,但是当我尝试在我的python代码中使用它时
result = work1.aggregate(pipe, 'allowDiskUse:true')
Run Code Online (Sandbox Code Playgroud)
我收到TypeError: aggregate() takes exactly 2 arguments (3 given)错误.(尽管在http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate:aggregate(pipeline,** kwargs)中给出了定义.
我尝试使用runCommand,或者说它的pymongo等价:
db.command('aggregate','work1',pipe, {'allowDiskUse':True})
Run Code Online (Sandbox Code Playgroud)
但现在我回到'聚合结果超过最大文档大小(16MB)'错误
如果你需要知道
pipe = [{'$project': {'_id': 0, 'summary.trigrams': 1}}, {'$unwind': '$summary'}, {'$unwind': '$summary.trigrams'}, {'$group': {'count': {'$sum': 1}, '_id': '$summary.trigrams'}}, {'$sort': {'count': -1}}, {'$limit': 10000}]
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个mongodb有很多领域的集合.一个字段是'date_time',它是ISO日期时间格式,Ex:,ISODate("2014-06-11T19:16:46Z")另一个字段是'name'.
鉴于a name,如何找到该系列中最老/最年轻的帖子?
例如:如果two集合'数据'中有帖子:
[{'name' : 'John', 'date_time' : ISODate("2014-06-11T19:16:46Z")},
{'name' : 'John', 'date_time' : ISODate("2015-06-11T19:16:46Z")}]
Run Code Online (Sandbox Code Playgroud)
鉴于"约翰"这个名字,我如何找到该系列中最老的帖子,即ISODate("2014-06-11T19:16:46Z")哪一个?同样对于最年轻的帖子.
我创建了一个集合并添加了一个这样的唯一键
db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})
Run Code Online (Sandbox Code Playgroud)
该集合看起来像这样的"user_services"
{
"_id" : ObjectId("55068b35f791c7f81000002d"),
"uid" : 15,
"sid" : 1,
"rate" : 5
},
{
"_id" : ObjectId("55068b35f791c7f81000002f"),
"uid" : 15,
"sid" : 1,
"rate" : 4
}
Run Code Online (Sandbox Code Playgroud)
问题:
我使用php驱动程序插入具有相同的uid和sid的文档,它正在插入.
我想要的是
如何将以下 MongoDB 查询转换为 Java Spring 应用程序要使用的查询?我找不到使用pipeline提供的查找方法的方法。
这是我试图转换的查询。我还想指出,我没有使用,$unwind因为我希望将deliveryZipCodeTimings保留为返回对象中的分组集合。
db.getCollection('fulfillmentChannel').aggregate([
{
$match: {
"dayOfWeek": "SOME_VARIABLE_STRING_1"
}
},
{
$lookup: {
from: "deliveryZipCodeTiming",
let: { location_id: "$fulfillmentLocationId" },
pipeline: [{
$match: {
$expr: {
$and: [
{$eq: ["$fulfillmentLocationId", "$$location_id"]},
{$eq: ["$zipCode", "SOME_VARIABLE_STRING_2"]}
]
}
}
},
{
$project: { _id: 0, zipCode: 1, cutoffTime: 1 }
}],
as: "deliveryZipCodeTimings"
}
},
{
$match: {
"deliveryZipCodeTimings": {$ne: []}
}
}
])
Run Code Online (Sandbox Code Playgroud) spring mongodb spring-data aggregation-framework spring-data-mongodb
如何连接两个字段中的值并将其放入第三个字段中,值为字符串.我试过这个:
db.collection.update({"_id" : { $exists : true }},
{$set: {column_2:{$add:['$column_4',
'$column_3']}}},
false, true)
Run Code Online (Sandbox Code Playgroud)
虽然似乎不起作用,但是抛出not ok for storage.我也试过这个:
db.collection.update({"_id" : { $exists : true }},
{$set: {column_2:{$add:['a',
'b']}}},
false, true)
Run Code Online (Sandbox Code Playgroud)
但即使这显示同样的错误not ok for storage.
我想只在mongo服务器上连接而不是在我的应用程序中连接.
string-concatenation mongodb mongodb-query mongodb-update aggregation-framework
我在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)
知道怎么做吗?聚合框架将是首选,因为我已经在某种程度上理解它:)
我有一个mongo支持的联系人数据库,我试图以一堆不同的方式找到重复的条目.
例如,如果2个联系人具有相同的电话号码,则会将其标记为可能的副本,同样适用于电子邮件等.
我在Debian上使用MongoDB 2.4.2和pyMongo以及MongoEngine.
到目前为止,我最接近的是查找并计算包含相同电话号码的记录:
dbh.person_document.aggregate([
{'$unwind': '$phones'},
{'$group': {'_id': '$phones', 'count': {'$sum': 1}}},
{'$sort': SON([('count', -1), ('_id', -1)])}
])
# Results in
{u'ok': 1.0,
u'result': [{u'_id': {u'number': u'404-231-4444', u'showroom_id': 5}, u'count': 5},
{u'_id': {u'number': u'205-265-6666', u'showroom_id': 5}, u'count': 5},
{u'_id': {u'number': u'213-785-7777', u'showroom_id': 5}, u'count': 4},
{u'_id': {u'number': u'334-821-9999', u'showroom_id': 5}, u'count': 3}
]}
Run Code Online (Sandbox Code Playgroud)
所以我可以得到重复的数字,但我不能为我的生活弄清楚如何返回实际包含这些项目的文档数组!
我想看到每个数字的这种返回数据:
# The ObjectIDs of the documents that contained the duplicate phone numbers
{u'_id': {u'number': u'404-231-4444', u'showroom_id': 5},
u'ids': [ObjectId('51c67e322b2192121ec4d8f2'), ObjectId('51c67e312b2192121ec4d8f0')],
u'count': 2},
Run Code Online (Sandbox Code Playgroud)
任何帮助是极大的赞赏!
我们的系统是运营商级并且非常强大,它经过负载测试以处理每秒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) 我使用Mongodb(2.6.0-rc2)聚合框架进行了长时间的工作:http://docs.mongodb.org/manual/core/aggregation-introduction/
我已经在javascript中编写了聚合并将作业作为脚本运行
(即mongo localhost:27017/test myjsfile.js).
启动脚本后,有什么方法可以查看作业的进度吗?
例如,使用示例聚合作业:
db.zipcodes.aggregate([
{$group: {
_id: "$state",
totalPop: {$sum: "$pop"}
}},
{$match: {totalPop: {$gte: 10*1000*1000 }}}
])
Run Code Online (Sandbox Code Playgroud)
我希望看到这份工作目前正在执行一个小组,并且完成了70%.
对于mongo的map reduce作业,您可以查看progress via db.currentOp(),其中有一个progress字段,显示完成的作业的百分比,如本文所述:
聚合有什么相似之处吗?
我有一个看起来大致如下的Mongodb架构:
[
{
"name" : "name1",
"instances" : [
{
"value" : 1,
"date" : ISODate("2015-03-04T00:00:00.000Z")
},
{
"value" : 2,
"date" : ISODate("2015-04-01T00:00:00.000Z")
},
{
"value" : 2.5,
"date" : ISODate("2015-03-05T00:00:00.000Z")
},
...
]
},
{
"name" : "name2",
"instances" : [
...
]
}
]
Run Code Online (Sandbox Code Playgroud)
其中每个元素的实例数量可能非常大.
我有时想只得到一个数据样本,也就是说,获取每个第三个实例,或每第10个实例......你得到了图片.
我可以通过获取所有实例并在我的服务器代码中过滤它们来实现这一目标,但我想知道是否有办法通过使用一些聚合查询来实现.
有任何想法吗?
更新
假设数据结构是扁平的,如下面的@SylvainLeroux所示,那就是:
[
{"name": "name1", "value": 1, "date": ISODate("2015-03-04T00:00:00.000Z")},
{"name": "name2", "value": 5, "date": ISODate("2015-04-04T00:00:00.000Z")},
{"name": "name1", "value": 2, "date": ISODate("2015-04-01T00:00:00.000Z")},
{"name": "name1", "value": 2.5, "date": ISODate("2015-03-05T00:00:00.000Z")},
...
] …Run Code Online (Sandbox Code Playgroud)