Node.js Mongodb:将元素列表从数组结构转换为对象结构以进行更新

Node.js Mongodb:将元素列表从数组结构转换为对象结构以进行更新,node.js,mongodb,node-mongodb-native,Node.js,Mongodb,Node Mongodb Native,我有一个文档集合,每个文档都有一个“列表”属性 这个列表是唯一对象的数组(我为每个对象生成了一个ObjectID)。我们称他们为听众 现在。我需要更新同一查询中的1个或多个元素我不需要对它们进行索引。 对于数组,我不能用它们各自的特定值来更新它们,它只能用相同的操作更新所有匹配项 我考虑将“列表”从数组转换为对象,对象的键是ObjectID值,因此我可以: { $set: { "list.23rwfsdgfsda.time":123, "list.GJHhjh34j2h.order": "asc

我有一个文档集合,每个文档都有一个“列表”属性

这个列表是唯一对象的数组(我为每个对象生成了一个ObjectID)。我们称他们为听众

现在。我需要更新同一查询中的1个或多个元素我不需要对它们进行索引。 对于数组,我不能用它们各自的特定值来更新它们,它只能用相同的操作更新所有匹配项

我考虑将“列表”从数组转换为对象,对象的键是ObjectID值,因此我可以:

{ $set: { "list.23rwfsdgfsda.time":123, "list.GJHhjh34j2h.order": "ascending" } }
这只是一个占位符示例,我知道它的12个字符代表键:p

我的问题围绕着关键点:12个字符太多了。我估计一个给定列表大约有300个可能的列表元素(可能更多),所以一个3个字符的16进制甚至10进制值就可以了

现在,如何为每个新listElement生成一个唯一的per-“list”键,同时避免使用计数器?对我来说,关键名称是什么并不重要,只要它们是简短的,并且每个“列表”都是唯一的


注:我不需要索引,因为我永远也找不到基于列表和/或其内容的集合中的所有文档。

您需要一些可以“键入”的内容。要么是一个计数器,要么是一个不会被快速插入的时间戳之类的东西。哦,嗨,WiredPairie:我在这附近见过你。我会关闭服务器时间,但实际上,快速插入会有点问题。问题是我只需要每个文档都是唯一的。实际上,客户端不可能在同一毫秒内进行两次插入。除了当前时间之外,我还能从服务器上得到什么独特的值吗?问题是,如果有,它需要足够大的数字,这样它就不会重复,这似乎违背了你的目标,即它是小的。例如,ObjectId总是唯一的。是的,但它的12个字符:|代表每个键名。以64为基数生成一个5个字符的数字怎么样?(字母数字+$++)我认为它有10亿种可能性,使同一个列表的2个值生成相同的0.00000…1%的值,这类东西曾经被玩弄过吗?如果你看看
ObjectId
用来保持唯一性的所有东西(例如UUID),你就会明白为什么这不是一个非常容易解决的问题。您将如何生成简短、独特(高效)的内容?即使删除ObjectId的一些有问题的方面(删除5个字节),最终也会得到一个12个字符的base64编码ID。