在将TTL添加到mongodb之后,我不能多次插入golang



上下文:

因此,我使用IndexModel创建了一个ttl,但当我将某个东西插入到集合中时,我不能再插入,它会将其作为错误返回:(0xd3cc80,0xc0004385b0)

改变"0"的值;exp";可以再次插入,但之后就不起作用了。

代码:

indexOptions := options.Index().SetExpireAfterSeconds(int32(url.Expires))
indexName, err := c.Coll.Indexes().CreateOne(
context.TODO(),
mongo.IndexModel{Keys: bson.M{"expires": 1}, Options: indexOptions},
)
if err != nil {
println(err)
return nil, err
}
println(indexName)
_, err = c.Coll.InsertOne(c.Ctx, url)
return url, err

请注意url。Expires是未来(大约+1天后)的Unix时间戳

附带问题:TTL应该什么时候删除东西?我做了一个测试,把它设置为20秒,但它还没有删除。

编辑1|索引:

[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { exp: 1 }, name: 'exp_1', expireAfterSeconds: 20 },
{
v: 2,
key: { expires: 1 },
name: 'expires_1',
expireAfterSeconds: 1672819674
},
{
v: 2,
key: { expires: -1 },
name: 'expires_-1',
expireAfterSeconds: 1672906158
},
{
v: 2,
key: { expires: 3000 },
name: 'expires_3000',
expireAfterSeconds: 1672906336
},
{
v: 2,
key: { created_at: 1 },
name: 'created_at_1',
expireAfterSeconds: 1672835415
}
]

这些是索引,问题似乎是键值总是一个设定值,例如:1、-1等。我该如何解决这个问题?有没有一种自动增加每个插入元素的数字的方法?

编辑2:

问题是,它是相同的值,通过改变它的随机数或独特的东西,然后它就工作了,但这感觉太麻烦了,有更好的方法来做这个吗

据我所知,问题与文档中值的唯一性无关。事实上,我认为这个问题根本与插入数据无关。相反,问题似乎是您正在创建重复的索引

您共享的代码显示了两件事:

  1. 函数首先尝试使用url对象中的一个字段提供的过期持续时间创建新索引
  2. 然后尝试使用相同的url对象将文档插入集合中

在任何情况下,这段代码都不应该创建索引,更不用说在使用插入数据库的同一对象中提供的持续时间值的情况下创建索引了。索引创建是一种维护类型的任务,通常很少在集合上执行,它旨在通过写入数据库的相同代码来完成。此外,TTL索引旨在为集合中的所有文档设置一致的过期时间行为。控制其特定到期的是文档中相应字段的

我建议如下:

  • 从该函数中删除所有与索引创建相关的代码
  • 从下面的四个"索引"中选择单个索引;"重复";它正确地定义了您想要的行为,并删除了其他三个。如果它们都没有,那么删除所有四个,创建一个你想要的新索引
{ v: 2, key: { exp: 1 }, name: 'exp_1', expireAfterSeconds: 20 },
{
v: 2,
key: { expires: 1 },
name: 'expires_1',
expireAfterSeconds: 1672819674
},
{
v: 2,
key: { expires: -1 },
name: 'expires_-1',
expireAfterSeconds: 1672906158
},
{
v: 2,
key: { expires: 3000 },
name: 'expires_3000',
expireAfterSeconds: 1672906336
},
  • 仔细检查问题中列出的最终索引是否为created_at上的单独TTL。如果没有,也删除那个

这些是索引,问题似乎是键值总是一个设定值,例如:1、-1等。我该如何解决这个问题?是否有一种自动增加每个插入元素的数字的方法?

你把两个想法混为一谈。索引的定义与文档中字段的值不同。对于集合的此字段,您将拥有一个TTL索引,并且它将具有静态定义。您不会在此处增加任何内容。索引定义中的1(或-1)值表示排序(升序或降序)。它与文档中字段的值无关,对于标准索引,它实际上不应该是1-1之外的任何其他值。

开放式问题

如果提供更多一致的故障排除信息,我们可以更好地回答这个问题。一些有用的澄清包括:

  • 数据库的版本是什么
  • Go驱动程序是什么版本
  • 你感兴趣的领域是exp还是expires?在描述您的情况时,您引用了这两个字段名称,并且还使用这两个名称建立了索引
  • 错误消息的字符串版本是什么?生成错误消息的行是什么?您引用的十六进制值对我们的目的没有帮助

最新更新