MongoDB-时间范围之间的连接
我想按时间间隔合并数据。现在我看到了下一个vaviant: 插入数据:MongoDB-时间范围之间的连接,mongodb,join,mongodb-query,Mongodb,Join,Mongodb Query,我想按时间间隔合并数据。现在我看到了下一个vaviant: 插入数据: use mydb db.items.insert( { name : "fakename1", created_at : 100, updated_at: 110 } ) db.items.insert( { name : "fakename1", created_at : 120, updated_at: 130 } ) db.items.insert( { name : "fakename1", created_at
use mydb
db.items.insert( { name : "fakename1", created_at : 100, updated_at: 110 } )
db.items.insert( { name : "fakename1", created_at : 120, updated_at: 130 } )
db.items.insert( { name : "fakename1", created_at : 130, updated_at: 140 } )
db.items.insert( { name : "fakename2", created_at : 101, updated_at: 103 } )
db.items.insert( { name : "fakename2", created_at : 102, updated_at: 105 } )
db.items.insert( { name : "fakename2", created_at : 122, updated_at: 126 } )
db.items.find(
{ $and: [
{ created_at: { $gte: 100 } },
{ updated_at: { $lte: 130 }},
{ name: { $eq : "fakename1" }}
]
}
).map(function(myDoc) {
myDoc.includes_items = db.items.find(
{ $and: [
{ created_at: { $gte: myDoc.created_at } },
{ updated_at: { $lte: myDoc.updated_at } },
{ name: { $ne : "fakename1" }}
]
}).toArray();
return myDoc;
}
)
[
{
"_id" : ObjectId("58ab2f2eafc914fa3475f42f"),
"name" : "fakename1",
"created_at" : 100,
"updated_at" : 110,
"includes_items" : [
{
"_id" : ObjectId("58ab2f32afc914fa3475f432"),
"name" : "fakename2",
"created_at" : 101,
"updated_at" : 103
},
{
"_id" : ObjectId("58ab2f32afc914fa3475f433"),
"name" : "fakename2",
"created_at" : 102,
"updated_at" : 105
}
]
},
{
"_id" : ObjectId("58ab2f2eafc914fa3475f430"),
"name" : "fakename1",
"created_at" : 120,
"updated_at" : 130,
"includes_items" : [
{
"_id" : ObjectId("58ab2f32afc914fa3475f434"),
"name" : "fakename2",
"created_at" : 122,
"updated_at" : 126
}
]
}
]
我的查询:
use mydb
db.items.insert( { name : "fakename1", created_at : 100, updated_at: 110 } )
db.items.insert( { name : "fakename1", created_at : 120, updated_at: 130 } )
db.items.insert( { name : "fakename1", created_at : 130, updated_at: 140 } )
db.items.insert( { name : "fakename2", created_at : 101, updated_at: 103 } )
db.items.insert( { name : "fakename2", created_at : 102, updated_at: 105 } )
db.items.insert( { name : "fakename2", created_at : 122, updated_at: 126 } )
db.items.find(
{ $and: [
{ created_at: { $gte: 100 } },
{ updated_at: { $lte: 130 }},
{ name: { $eq : "fakename1" }}
]
}
).map(function(myDoc) {
myDoc.includes_items = db.items.find(
{ $and: [
{ created_at: { $gte: myDoc.created_at } },
{ updated_at: { $lte: myDoc.updated_at } },
{ name: { $ne : "fakename1" }}
]
}).toArray();
return myDoc;
}
)
[
{
"_id" : ObjectId("58ab2f2eafc914fa3475f42f"),
"name" : "fakename1",
"created_at" : 100,
"updated_at" : 110,
"includes_items" : [
{
"_id" : ObjectId("58ab2f32afc914fa3475f432"),
"name" : "fakename2",
"created_at" : 101,
"updated_at" : 103
},
{
"_id" : ObjectId("58ab2f32afc914fa3475f433"),
"name" : "fakename2",
"created_at" : 102,
"updated_at" : 105
}
]
},
{
"_id" : ObjectId("58ab2f2eafc914fa3475f430"),
"name" : "fakename1",
"created_at" : 120,
"updated_at" : 130,
"includes_items" : [
{
"_id" : ObjectId("58ab2f32afc914fa3475f434"),
"name" : "fakename2",
"created_at" : 122,
"updated_at" : 126
}
]
}
]
结果:
use mydb
db.items.insert( { name : "fakename1", created_at : 100, updated_at: 110 } )
db.items.insert( { name : "fakename1", created_at : 120, updated_at: 130 } )
db.items.insert( { name : "fakename1", created_at : 130, updated_at: 140 } )
db.items.insert( { name : "fakename2", created_at : 101, updated_at: 103 } )
db.items.insert( { name : "fakename2", created_at : 102, updated_at: 105 } )
db.items.insert( { name : "fakename2", created_at : 122, updated_at: 126 } )
db.items.find(
{ $and: [
{ created_at: { $gte: 100 } },
{ updated_at: { $lte: 130 }},
{ name: { $eq : "fakename1" }}
]
}
).map(function(myDoc) {
myDoc.includes_items = db.items.find(
{ $and: [
{ created_at: { $gte: myDoc.created_at } },
{ updated_at: { $lte: myDoc.updated_at } },
{ name: { $ne : "fakename1" }}
]
}).toArray();
return myDoc;
}
)
[
{
"_id" : ObjectId("58ab2f2eafc914fa3475f42f"),
"name" : "fakename1",
"created_at" : 100,
"updated_at" : 110,
"includes_items" : [
{
"_id" : ObjectId("58ab2f32afc914fa3475f432"),
"name" : "fakename2",
"created_at" : 101,
"updated_at" : 103
},
{
"_id" : ObjectId("58ab2f32afc914fa3475f433"),
"name" : "fakename2",
"created_at" : 102,
"updated_at" : 105
}
]
},
{
"_id" : ObjectId("58ab2f2eafc914fa3475f430"),
"name" : "fakename1",
"created_at" : 120,
"updated_at" : 130,
"includes_items" : [
{
"_id" : ObjectId("58ab2f32afc914fa3475f434"),
"name" : "fakename2",
"created_at" : 122,
"updated_at" : 126
}
]
}
]
但是调用myDoc.events需要很长时间。我想替换它,使用这个功能,但我不知道怎么做。也许我应该使用?该查询表示,对于第一次查找中的每个文档,它将执行另一次查找,以查找相同的内容。因此,如果有10个文档,它将进行11次查找。糟糕的做法,但您可以在第一次搜索时设置限制1,我认为这会满足您的要求。@dnlbmn我知道这是一种糟糕的做法,但我找不到任何其他方法来进行此操作,因此我询问如何更改此限制。也许我应该使用MapReduce?您可以使用链接更新您的问题,包括一些我们可以用于测试的示例文档,以及您对该示例的预期输出是什么?@chridam I更改了问题。这是尝试在NoSQL数据库上强制执行结构的教科书案例。将order_项目推送到order文档中的数组中,而不是添加新的第一类文档,或者使用SQL数据存储。请看,该查询表示,对于第一次查找中的每个文档,它将执行另一次查找,以查找相同的内容。因此,如果有10个文档,它将进行11次查找。糟糕的做法,但您可以在第一次搜索时设置限制1,我认为这会满足您的要求。@dnlbmn我知道这是一种糟糕的做法,但我找不到任何其他方法来进行此操作,因此我询问如何更改此限制。也许我应该使用MapReduce?您可以使用链接更新您的问题,包括一些我们可以用于测试的示例文档,以及您对该示例的预期输出是什么?@chridam I更改了问题。这是尝试在NoSQL数据库上强制执行结构的教科书案例。将order_项目推送到order文档中的数组中,而不是添加新的第一类文档,或者使用SQL数据存储。看见