我使用MongoDB 2.2.2 for 32位Windows7机器.我在.js文件中有一个复杂的聚合查询.我需要在shell上执行此文件并将输出定向到CSV文件.我确保查询返回一个"扁平"json(没有嵌套键),因此它本身可以转换为一个整洁的csv.
我知道load()和eval().eval()要求我将整个查询粘贴到shell中,只允许printjson()在脚本内部,而我需要csv.并且,第二种方式:load()..它在屏幕上打印输出,并再次以json格式打印.
Mongo有没有办法从json转换到csv?(我需要csv文件来准备数据上的图表).我在想:
1.要么mongo有一个内置命令,我现在找不到.
蒙哥不能帮我做; 我最多可以将json输出发送到一个文件,然后我需要将其转换为csv.
3. Mongo可以将json输出发送到临时集合,其内容可以很容易地转换mongoexported为csv格式.但我认为只有map-reduce查询支持输出集合.是对的吗?我需要它来进行聚合查询.
谢谢你的帮助 :)
关于何时使用group(),与$ group或mapreduce聚合,我有点困惑.我在http://www.mongodb.org/display/DOCS/Aggregation上阅读了针对group()的文档,http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group for $ group ..分片是否group()不起作用的唯一情况?另外,我觉得$ group比group()更强大,因为它可以与聚合框架中的其他管道运算符一起使用.$ group如何与mapreduce进行比较?我在某处读到它不生成任何临时集合,而mapreduce则生成.是这样吗?
有人可以提供插图或指导我一起解释这三个概念的链接,采用相同的样本数据,以便我可以轻松地比较它们吗?
编辑:
此外,如果您可以在这些命令中指出任何新的东西,那将是很好的,因为新的2.2版本出来了..
我在mongodb中的集合类似于SQL中的下表:
情感(公司,感悟)
现在,我需要执行这样的查询:
SELECT
Company,
SUM(CASE WHEN Sentiment >0 THEN Sentiment ELSE 0 END) AS SumPosSenti,
SUM(CASE WHEN Sentiment <0 THEN Sentiment ELSE 0 END) AS SumNegSenti
FROM Sentiments
GROUP BY Company
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能在Mongo中编写这个查询?我被困在以下查询中:
db.Sentiments.aggregate(
{ $project: {_id:0, Company:1, Sentiment: 1} },
{ $group: {_id: "$Company", SumPosSenti: {$sum: ? }, SumNegSenti: {$sum: ? } } }
);
Run Code Online (Sandbox Code Playgroud) 我有两个密钥A和B,它们在文档中的存在是互斥的.当A存在时我必须按A分组,当B存在时我必须按B分组.所以我$project将所需的值输入到一个名为MyKey的计算密钥中,我将执行该操作$group.但看起来我的语法错了.我尝试用两种方式编写$ project:
{$project: {MyKey: {$cond: [{$exists: ["$A", true]}, "$A", "$B"]}}}
和
{$project: {MyKey: {$cond: [{"A": {$exists:true}}, "$A", "$B"]}}}
但我一直收到错误:
{ "errmsg" : "exception: invalid operator '$exists'", "code" : 15999, "ok" : 0 } ...
出了什么问题?
为什么StackJava中有一个empty()常规方法isEmpty()?Stack扩展的所有抽象类都有一个isEmpty()方法.
我一直试图理解MongoDB中MapReduce的基础知识,甚至在实现它之后,我不确定它与SQL的GROUP BY甚至是Mongo自己的GROUP BY有什么不同.在SQL Server中,GROUP BY可以通过流或散列聚合完成.MapReduce是不是类似于哈希聚合,只是在大量的服务器上?
我一直在阅读MongoDB的MR将作为后台进程运行的地方,因为它是一个"繁重的操作".鉴于数据是分片的,GROUP BY不会同样"重"吗?也就是说,我只是想比较那些可以作为MR作业或使用GROUP BY查询实现的操作类型.
是否有GROUP BY不能做的事情,只有MR可以做?
此外,Hadoop似乎非常擅长MR(这只是我读过的内容......我从来没有在Hadoop上工作过).Hadoop的MR与Mongo的MR有何不同?
我糊涂了.请帮助或指导我一个解释MapReduce需求的好教程.
请仔细阅读我的这个问题:
MongoDB $ group和带有计算列的显式组形成
但这一次,我需要比较字符串,而不是数字.CASE查询必须有一个LIKE:
CASE WHEN source LIKE '%Web%' THEN 'Web'
然后我需要按源分组.如何在Mongo中写这个?我正在尝试以下但不确定是否$regex支持内部$cond.顺便问一下,$cond某处有一个有效运算符列表吗?貌似$cond不是很喜欢我:)
db.Twitter.aggregate(
{ $project: {
"_id":0,
"Source": {
$cond: [
{ $regex:['$source','/.* Android.*/'] },
'Android',
{ $cond: [
{ $eq: ['$source', 'web'] }, 'Web', 'Others'
] }
]
}
} }
);
Run Code Online (Sandbox Code Playgroud)
我需要在那里写下许多其他值,进行更深层次的嵌套.为简洁起见,这只是"Android"和"Web"的一个例子.我$eq和两个都试过了$regex.使用$regex给出无效运算符的错误,而使用$eq不理解正则表达式并将所有内容放在"其他"下.如果这可以使用正则表达式,请告诉我如何编写它以区分大小写匹配.
谢谢你的帮助 :-)
我一直在阅读标签识别分片.这些是我提到的链接:
http://www.mongodb.org/display/DOCS/Tag+Aware+Sharding
http://www.kchodorow.com/blog/2012/ 07/25 /控制 - 收集 - 分发/
Kristina以非常清晰的方式解释了这个概念,有一件事是肯定的:这一增强将使MongoDB更加适合开发人员.
但是我的问题是......看起来标记/重新标记意味着可以轻松地迁移块.将所有写入到首选数据中心等等.但是这如何适应旧的范围分区系统和Mongo学习的方式平衡的关键分布?据说shard-key无法更改,这是因为假设数据分布在分片上并且更改分片键会干扰这一点.是不是应用基本上做同样的标签?标签感知分片是否意味着要处理这个问题?
编辑:
任何想法如何影响这些巨大的迁移?