MongoDB-时间范围之间的连接

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

我想按时间间隔合并数据。现在我看到了下一个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 : 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数据存储。看见