如果您是一名蒙哥神,无论如何想帮助我,这篇文章将非常长,我衷心感谢您。对于收集到的所有数据,我会尽量讲究。
我在MongoDD数据库中遇到一些奇怪的行为,并且我在质疑mongodb的写入顺序。
我记录了一些错误,这些错误只在执行时发生,这使我认为这里存在一个计时问题,但是请求是如此缓慢,以至于我不明白在糟糕的情况下它会如何发生
起点:
db.getCollection('eventStore').find({
'_id': {
'$gt': ObjectId("5d285c784460c502cc66ff9b"),
'$lte': ObjectId("5d285cf7856cda0266215c77")
}
})
collection.find({
'_id': {
...(lower ? { '$gt': lower } : {}),
'$lte': higher
}
}).sort({ _id: 1 }).stream({
transform: (element) => {
logger.info(`Exiting Get events by range::${JSON.stringify(lower)}::${JSON.stringify(higher)}`)
logger.info(`Parse event::${JSON.stringify(element)}}`)
return // PARSED EVENT
}
})
.sort({ _id: 1 })
可能没有用,但是我还是把它放在这里,以防万一。 /* 1 */
{
"_id" : ObjectId("5d285cf77f6482027108c15c"),
"events" : [
// Some events
]
}
/* 2 */
{
"_id" : ObjectId("5d285cf77f6482027108c15d"),
"events" : [
// Some events
]
}
/* 3 */
{
"_id" : ObjectId("5d285cf7856cda0266215c77"),
"events" : [
// Some events
]
}
预期的Mongo行为:
实际行为(在记录器的功能中记录):
{"message":"Exiting Get events by range::\"5d285c784460c502cc66ff9b\"::\"5d285cf7856cda0266215c77\"","level":"info","timestamp":"2019-07-12 10:12:07"}
{"message":"Parse event::{\"_id\":\"5d285cf77f6482027108c15c\",\"events\":[ // Data ]}}","level":"info","timestamp":"2019-07-12 10:12:07"}
{"message":"Exiting Get events by range::\"5d285c784460c502cc66ff9b\"::\"5d285cf7856cda0266215c77\"","level":"info","timestamp":"2019-07-12 10:12:07"}
{"message":"Parse event::{\"_id\":\"5d285cf7856cda0266215c77\",\"events\":[ // Data ]}}","level":"info","timestamp":"2019-07-12 10:12:07"}
答案 0 :(得分:1)
Mongo正在自动分配ID,因此我希望将ID ObjectId(“ 5d285cf7856cda0266215c77”)存储在基准库中时,所有带有较早时间戳记的ID都已安全地存储在基准库中。 ==>无后退
Mongo _ids
是ObjectIds
,它们是:
- 一个4字节的值,表示自Unix时代以来的秒数,
- 5个字节的随机值,并且
- 3字节计数器,以随机值开头。
这些通常是通过应用程序驱动程序代码生成的(在将数据发送到mongo的服务器上)。
这意味着:
如果您查看共享的_id,则5d285cf77f6482027108c15d
和5d285cf7856cda0266215c77
(5d285cf7
)的前4个字节(8个字符)都共享相同的时间戳,因为它们发生了在时代之后的同一秒内。