我想在JavaScript中将ObjectID(Mongodb)转换为String.当我从一个对象形式MongoDB.它就像一个对象有:timestamp,second,inc,machine.我无法转换为字符串.
我有一个包含数百万行的mongoDB集合,我正在尝试优化我的查询.我目前正在使用聚合框架来检索数据并根据需要对它们进行分组.我的典型聚合查询类似于:$match > $group > $ group > $project
但是,我注意到最后的部分只花了几毫秒,开始是最慢的.
我尝试仅使用$ match过滤器执行查询,然后使用collection.find执行相同的查询.聚合查询需要大约80毫秒,而查询查询需要0或1毫秒.
我几乎每个字段都有索引,所以我想这不是问题.什么可能出错?或者它只是聚合框架的"正常"缺点?
我可以使用查找查询而不是聚合查询,但是我必须在请求之后执行大量处理,并且这个过程可以快速完成$group等等,所以我宁愿保留聚合框架.
谢谢,
编辑:
这是我的标准:
{
"action" : "click",
"timestamp" : {
"$gt" : ISODate("2015-01-01T00:00:00Z"),
"$lt" : ISODate("2015-02-011T00:00:00Z")
},
"itemId" : "5"
}
Run Code Online (Sandbox Code Playgroud) 假设我的MongoDB架构如下所示:
{car_id: "...", owner_id: "..."}
Run Code Online (Sandbox Code Playgroud)
这是一种多对多的关系.例如,数据可能如下所示:
+-----+----------+--------+
| _id | owner_id | car_id |
+-----+----------+--------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 1 |
| 5 | 2 | 2 |
| 6 | 3 | 4 |
| 7 | 3 | 5 |
| 8 | 3 | 6 |
| 9 | 3 | 7 |
| 10 …Run Code Online (Sandbox Code Playgroud) 我有一个像这个结构的"状态"集合 -
{
_id: ObjectId("545a0b63b03dbcd1238b4567"),
status: 1004,
comment: "Rem dolor ipsam placeat omnis non. Aspernatur nobis qui nisi similique.",
created_at: ISODate("2014-11-05T11:34:59.804Z")
},
{
_id: ObjectId("545a0b66b03dbcd1238b4568"),
status: 1001,
comment: "Sint et eos vero ipsa voluptatem harum. Hic unde voluptatibus et blanditiis quod modi.",
created_at: ISODate("2014-11-05T11:35:02.814Z")
}
....
....
Run Code Online (Sandbox Code Playgroud)
我需要从该集合中获得15分钟间隔的结果.
我很难相信这个问题还没有在某个地方被问过和回答,但是我找不到它的任何痕迹.
我有一个需要按布尔值分组的MongoDB聚合查询:是否存在另一个字段.
例如,让我们从这个集合开始:
> db.test.find()
{ "_id" : ObjectId("53fbede62827b89e4f86c12e"),
"field" : ObjectId("53fbede62827b89e4f86c12d"), "name" : "Erik" }
{ "_id" : ObjectId("53fbee002827b89e4f86c12f"), "name" : "Erik" }
{ "_id" : ObjectId("53fbee092827b89e4f86c131"),
"field" : ObjectId("53fbee092827b89e4f86c130"), "name" : "John" }
{ "_id" : ObjectId("53fbee122827b89e4f86c132"), "name" : "Ben" }
Run Code Online (Sandbox Code Playgroud)
2个文件有"字段",2个没有.注意,"field"的每个值可能不同; 我们只想对它的存在进行分组(或者非null也适用于我,我没有存储任何空值).
我已经尝试过使用$ project,但是$ exists不存在,$ cond和$ ifNull没有帮助我.该字段似乎总是存在,即使它不存在:
> db.test.aggregate(
{$project:{fieldExists:{$cond:[{$eq:["$field", null]}, false, true]}}},
{$group:{_id:"$fieldExists", count:{$sum:1}}}
)
{ "_id" : true, "count" : 4 }
Run Code Online (Sandbox Code Playgroud)
我希望以下更简单的聚合工作,但由于某种原因,$ exists不支持这种方式:
> db.test.aggregate({$group:{_id:{$exists:"$field"}, count:{$sum:1}}})
assert: command failed: {
"errmsg" : "exception: invalid …Run Code Online (Sandbox Code Playgroud) 关于何时使用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的理论以及不支持连接的事实,并且我应该尽可能地使用嵌入文档或非规范化,但是这里是:
我有多个文件,例如:
例:
Users:
{ _id: 1, first_name: 'Bill', last_name: 'Gates', suburb: 1 }
{ _id: 2, first_name: 'Steve', last_name: 'Jobs', suburb: 3 }
Suburb:
{ _id: 1, name: 'Suburb A', state: 1 }
{ _id: 2, name: 'Suburb B', state: 1 }
{ _id: 3, name: 'Suburb C', state: 3 }
State:
{ _id: 1, name: 'LA' }
{ _id: 3, name: 'NY' }
Child:
{ _id: 1, _user_id: 1, first_name: 'Little Billy', last_name: 'Gates' } …Run Code Online (Sandbox Code Playgroud) 我有一个文章列表,每个文章都有一个数组属性,列出了其中提到的各个人:
_id: {
$oid: "52b632a9e4f2ba13c82ccd23"
},
providerName: "The Guardian",
url: "http://feeds.theguardian.com/c/34708/f/663860/s/3516cebc/sc/38/l/0L0Stheguardian0N0Cmusic0C20A130Cdec0C220Cwaterboys0Efishermans0Eblues0Etour0Ehammersmith/story01.htm",
subject: "The Waterboys – review",
class_artist: [
"paul mccartney"
]
Run Code Online (Sandbox Code Playgroud)
我一直在努力(不成功)class_artist根据他们在过去7天内被标记的文章数量来获取所有个体艺术家的列表().
我已经达到了:
var date = new Date();
date.setDate(date.getDate() - 7);
db.articles.group({
key: { class_artist: 1 },
cond: { class_date: { $gt: date } },
reduce: function ( curr, result ) { result.cnt++; },
initial: { cnt : 0 }
}).sort({cnt: -1});
Run Code Online (Sandbox Code Playgroud)
但不幸的是,它并不是基于单个数组值来计算它们,而是基于数组合成(即艺术家列表).
我尝试使用该$unwind功能,但无法使其工作.
当我阅读文档时,我发现了以下注释:
当$ sort紧接在管道中的$ limit之前时,$ sort操作仅保持前n个结果,其中n是指定的限制,而MongoDB只需要在内存中存储n个项目.当allowDiskUse为true且n个项超过聚合内存限制时,此优化仍适用.
如果我对此是正确的,它仅适用于我同时使用$ sort和$ limit的情况
db.coll.aggregate([
...,
{$sort: ...},
{$limit: limit},
...
]);
Run Code Online (Sandbox Code Playgroud)
但是,我想我们大部分时间都会这样做
db.coll.aggregate([
...,
{$sort: ...},
{$skip: skip},
{$limit: limit},
...
]);
Run Code Online (Sandbox Code Playgroud)
问题1:如果我在这里使用$ skip,是否意味着上述规则不适用?
我问这个问题,因为理论上MongoDB仍然可以计算前n个记录,并通过只排序前n个记录来提高性能.我没有找到任何关于此的文件.如果规则不适用,
问题2:我是否需要将查询更改为以下内容以提高性能?
db.coll.aggregate([
...,
{$sort: ...},
{$limit: skip + limit},
{$skip: skip},
{$limit: limit},
...
]);
Run Code Online (Sandbox Code Playgroud)
编辑:我认为解释我的用例会使上面的问题更有意义.我正在使用MongoDB 2.6提供的文本搜索功能来查找产品.我担心如果用户输入一个非常常见的关键词,如"红色",将返回太多结果.因此,我正在寻找更好的方法来生成这个结果.
EDIT2:事实证明上面的最后一个代码等于
db.coll.aggregate([
...,
{$sort: ...},
{$limit: skip + limit},
{$skip: skip},
...
]);
Run Code Online (Sandbox Code Playgroud)
因此,我总是可以使用此表单来应用前n个规则.
我在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)