我正在尝试按两个字段对文档进行分组,field1并且field2.
myCollection.aggregate([{
$group: {
_id: {
group1: "$field1",
group2: "$field2"
},
count: {
$sum: 1
}
}
}])
Run Code Online (Sandbox Code Playgroud)
效果很好,可以产生预期的结果。
但我想在循环中重新运行上面的代码,每次运行都会有不同的结果$field2,所以下面的代码失败了,我该怎么办?谢谢
myCollection.aggregate([{
$group: {
_id: {
group1: "$field1",
group2: "$field2"
},
count: {
$sum: 1
}
}
}])
Run Code Online (Sandbox Code Playgroud) javascript mongodb mongodb-query aggregation-framework mongodb-aggregation
采取这个查询:
{ 'location' : { '$near' : [x,y], '$maxDistance' : this.field } }
Run Code Online (Sandbox Code Playgroud)
我想将当前评估文档中指定字段的值分配给 $maxDistance 。那可能吗?
geospatial mongodb mongodb-query aggregation-framework spring-mongodb
我有一个用例,需要显示组和排序聚合中的前 10 名和最后 10 名结果。我尝试使用$limit,但这不会让下一个聚合器处理完整的数据。
db.collection.aggregate([groupAggregator, sortAggregator, { $limit: 10 }, /*only 10 records available*/]
Run Code Online (Sandbox Code Playgroud)
如何在管道中间对整个集合执行聚合?我在用MongoDB 3.2.9。如果这是不可能的,有没有办法联合两个聚合,第一个是 ,top 10 (ASC SORTED)第二个是last 10 (DESC SORTED),
如果不是为了小组聚合,我会使用该db.collection.find({}).sort().filter()策略,但小组需要完成。
组聚合得到的数据
{_id: "", ..., avg_count: 10}
{_id: "", ..., avg_count: 1}
{_id: "", ..., avg_count: 2}
{_id: "", ..., avg_count: 5}
{_id: "", ..., avg_count: 8}
{_id: "", ..., avg_count: 3}
{_id: "", ..., avg_count: 4}
{_id: "", ..., avg_count: 6}
{_id: "", ..., avg_count: …Run Code Online (Sandbox Code Playgroud) 我有一个包含 job_title、job_location、salary 等的Job schema
ApplicationSchema将子文档嵌入到作业文档中,它存储该特定作业已收到的所有申请
这是作业架构的样子
const jobSchema = new Schema({
job_title : {
type : String,
required : true
},
job_location : {
type : String,
},
salary : {
type : Number
},
applications: [ApplicationSchema],
companyId : {
type: mongoose.Schema.Types.ObjectId,
ref: 'Company'
}
},{timestamps : true});
var Job = mongoose.model('Job', jobSchema);
module.exports = Job;
Run Code Online (Sandbox Code Playgroud)
您可以看到上面的应用程序子文档。
这是当没有特定工作申请时我的工作文档的样子
{
"_id" : ObjectId("5ac873c3bb7a9c3168ff159e"),
"applications" : [],
"job_title" : "Junior Developer",
"companyId" : ObjectId("5ac870d0bb7a9c3168ff159c"),
"createdAt" : ISODate("2018-04-07T07:31:15.257Z"),
"updatedAt" : ISODate("2018-04-07T09:20:52.237Z"), …Run Code Online (Sandbox Code Playgroud) 我有一个代码查询$gte日期,它工作正常。
cityCollection.aggregate([
{
"$project": {
theater: true,
movie: {
$filter: {
input: {
$map: {
input: "$movie",
as: "movie",
in: {
cnName: "$$movie.cnName",
enName: "$$movie.enName",
releasedTime: {
$filter: {
input: "$$movie.releasedTime",
as: "movie",
cond: { $and:{
$gte: [ "$$movie", new Date(`${today} 20:00:00.000Z`) ]
}}
}
}
}
}
},
as: "movie",
cond: "$$movie"
}
}
}
}
])
.then(drivers => res.send(drivers))
.catch(next);
Run Code Online (Sandbox Code Playgroud)
现在我想在两个日期之间查询,我尝试$lte在代码中添加如下内容:
releasedTime: {
$filter: {
input: "$$movie.releasedTime",
as: "movie",
cond: {
$gte: [ "$$movie", …Run Code Online (Sandbox Code Playgroud) 我可以在文档中看到可用于某些 mongo 查询的文档,这确实很有帮助,但除了没有提供太多信息的标志explain("executionStats")之外,我看不到聚合查询的此类实用程序。explain是否有计划将完整概述也集成到聚合查询中?
我有一个带有日期字段的集合:
{
"_id" : ObjectId("5b92b359ddceef5b24502834"),
"dateTimeGMT" : ISODate("2018-08-22T09:29:25.000Z"),
yada, yada, yada
}
Run Code Online (Sandbox Code Playgroud)
我试图使用 mongo-go-driver 的 ParseExtJSONArray 函数在 $match 聚合阶段按日期查找。(我知道如何直接使用 *bson.Array 执行此操作。我问是为了知道使用 ParserExtJSONArray 执行此操作的正确方法,或者如果我遇到了限制。)
我已简化此示例并确认它与上述文档不匹配。
pipeline, err := bson.ParseExtJSONArray(`[
{ "$match": { "dateTimeGMT.$date":"2018-08-22T09:29:25.000Z" } }
]`)
cursor, err := receivedFromResponseQueue.Aggregate(ctx, pipeline)
Run Code Online (Sandbox Code Playgroud)
以下内容在 mongo shell 中不起作用。(这并不奇怪,因为它会自动转换为 ISODate() 格式)
db.getCollection('received_from_response_queue').aggregate([
{ "$match": { "dateTimeGMT.$date":"2018-08-22T09:29:25.000Z" } }
])
Run Code Online (Sandbox Code Playgroud)
但这在 mongo shell 中确实有效。
db.getCollection('received_from_response_queue').aggregate([
{ "$match": { "dateTimeGMT": ISODate("2018-08-22T09:29:25.000Z") } }
])
Run Code Online (Sandbox Code Playgroud)
但这会在“pipeline”中返回一个空数组。(因为 ParseExtJSONArray 不处理 JavaScript)
pipeline, err := bson.ParseExtJSONArray(`[
{ "$match": { "dateTimeGMT":ISODate("2018-08-22T09:29:25.000Z") } …Run Code Online (Sandbox Code Playgroud) MongoDB 数据库版本 3.4.18。
我想合并来自外部集合的数据,但我不想拥有所有键,我想做出限制,如下所示:
db.users.find({}, {password:0}, (err, docs) => {});
Run Code Online (Sandbox Code Playgroud)
这是我的聚合查询:
let query = [
{
// match from first collection (activities)
$match: {
"_id": ObjectId("5be46f266e4a182384b3ae6a")
}
},
{
// limit fields from first collection (activities)
$project: {
"_user": 1,
date: 1
}
},
{
// join a foreign collection - but how to avoice the password key? for example.
$lookup: {
from: "users",
localField: "_user",
foreignField: "_id",
as: "user"
}
}
];
db.activities.aggregate(query, (err, docs) => {
console.log(docs[0].user);
return …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的对象
{
"_id" : {
"import_type" : "MANUAL_UPLOAD",
"supplier" : "jabino.de",
"unit_price" : "0"
},
"statuses" : [
{
"status" : "DUPLICATED",
"count" : 14
},
{
"status" : "BLACKLISTED",
"count" : 2
},
{
"status" : "USABLE",
"count" : 2239
},
{
"status" : "INVALID_EMAIL_ADDRESS",
"count" : 1
},
{
"status" : "DUPLICATED",
"count" : 14
},
{
"status" : "BLACKLISTED",
"count" : 2
},
{
"status" : "USABLE",
"count" : 2239
},
{
"status" : "INVALID_EMAIL_ADDRESS",
"count" : …Run Code Online (Sandbox Code Playgroud) 我还需要每天获取特定日期范围内的个人用户数量。假设一个月内(1 日 - 30 日)总共有 100 个用户,我需要像这样获得计数
{
1st - 2 users
2nd - 10 users
}
MessagesSchema.statics.totalMessagesGraph = (id, startDate, endDate, platform) => {
return Messages.aggregate([
{
$match: {
id: id,
platform: platform,
timestamp: {
$gte: new Date(startDate),
$lte: new Date(endDate)
}
}
}
])
}
Run Code Online (Sandbox Code Playgroud)
为了获得想要的结果,这里应该做什么?
预期结果:
对于该特定日期范围,每天的计数。
{
date1 - 20,
date2 - 22,
date3 - 24,
...
date30 - 12
}
Run Code Online (Sandbox Code Playgroud)
预期输出应如上所示。之后应该进行什么查询$match。如果可能,请获取样本数据集并提供输出。
mongodb ×9
mongoose ×2
aggregation ×1
geospatial ×1
go ×1
javascript ×1
mongo-go ×1
node.js ×1