使用$sample从AmazonDocumentDB检索随机文档



为了支持应用程序功能,我需要从Amazon DocumentDB中的集合中检索一个文档,而不是每次都检索同一个文档。

MongoDB文档指出,$sample聚合阶段可用于使用伪随机光标选择多个文档。我在本地MongoDB实例上尝试过,它确实返回了一个随机选择的文档,这正是我所需要的。

db.benchmark.aggregate([
{ $sample: { size: 1}}
])

然而,当我尝试在AmazonDocumentDB上使用相同的查询时,它不会返回随机记录,而是一致地返回集合中的第一条记录。这似乎不是很有用,因为它和limit是相同的功能。Amazon文档表明DocumentDB支持$sample阶段,但没有提供关于其实现的进一步信息。

有没有一种方法可以让DocumentDB使用$sample聚合阶段操作符来选择一个随机记录?

示例:

db.temp.insertMany([
{ "_id": 1, "temperature" : 97.5, "humidity": 0.61, "timestamp" : new Date() },
{ "_id": 2, "temperature" : 97.2, "humidity": 0.60, "timestamp" : new Date() },
{ "_id": 3, "temperature" : 97.4, "humidity": 0.61, "timestamp" : new Date() },
{ "_id": 4, "temperature" : 97.9, "humidity": 0.61, "timestamp" : new Date() },
{ "_id": 5, "temperature" : 97.6, "humidity": 0.61, "timestamp" : new Date() },
{ "_id": 6, "temperature" : 97.5, "humidity": 0.62, "timestamp" : new Date() },
{ "_id": 7, "temperature" : 97.2, "humidity": 0.62, "timestamp" : new Date() },
{ "_id": 8, "temperature" : 97.1, "humidity": 0.63, "timestamp" : new Date() },
{ "_id": 9, "temperature" : 96.9, "humidity": 0.62, "timestamp" : new Date() },
{ "_id": 10, "temperature" : 97.4, "humidity": 0.63, "timestamp" : new Date()}
])
db.temp.aggregate(
[ { $sample: { size: 1 } } ]
)
db.temp.aggregate(
[ { $sample: { size: 1 } } ]
)

Windows 上的MongoDB 4.4.3

[
{
"_id": 3,
"humidity": 0.61,
"temperature": 97.4,
"timestamp": {"$date": "2021-04-13T22:00:09.361Z"}
}
]
[
{
"_id": 8,
"humidity": 0.63,
"temperature": 97.1,
"timestamp": {"$date": "2021-04-13T22:00:09.361Z"}
}
]

DocumentDB 4.0.0

[
{
"_id": 1,
"humidity": 0.61,
"temperature": 97.5,
"timestamp": {"$date": "2021-04-13T22:00:45.628Z"}
}
]
[
{
"_id": 1,
"humidity": 0.61,
"temperature": 97.5,
"timestamp": {"$date": "2021-04-13T22:00:45.628Z"}
}
]

您可以尝试在这里创建自己的逻辑。

  1. 如果DynamoDB中的行数固定,则使用它。否则,每5分钟或每100次(或第1000次(调用数据库获取行数
  2. 使用随机数生成器从计数中选择一个随机数
  3. 从DB中获取该特定行:(

在DocumentDB中选择一组随机记录将无法像在MongoDB中那样使用$sample运算符。

DocumentDB的当前实现将只从集合的静态子集中随机选择的记录开始选择一系列连续的记录。静态子集的大小与整个集合的大小有关,并且可能与记录在磁盘上分组的方式有关。对于一个足够小的集合(大约<50条记录(,静态子集可能只包含一个点,并且使用$sample运算符的查询每次都会返回相同系列的记录。

要获得MongoDB和DocumentDB之间的兼容行为,请使用一个结合了跳过和限制的管道:

db.temp.aggregate([ 
{ 
$skip : db.temp.countDocuments() * Math.random() 
}, 
{ 
$limit: 1
}
]);

相关内容

  • 没有找到相关文章

最新更新