gpt4 book ai didi

文档子集中的 MongoDB 流水号

转载 作者:行者123 更新时间:2023-12-05 05:51:41 25 4
gpt4 key购买 nike

我现有的文档集约有 1200 万份。我想更新所有文档中的一个字段,以便在共享公共(public)“ref”字段的所有文档组中有一个连续编号。这将是一次性操作。有什么方法可以在 MongoDB 4.4 中实现这一点?

简化文档示例:

{"_id": 1, "ref": "REF_A", "description": "aaaa"}
{"_id": 2, "ref": "REF_A", "description": "bbbb"}
{"_id": 3, "ref": "REF_A", "description": "cccc"}
{"_id": 4, "ref": "REF_B", "description": "dddd"}
{"_id": 5, "ref": "REF_B", "description": "eeee"}
...

所需的修改输出:

{"_id": 1, "ref": "REF_A", "description": "aaaa1"}
{"_id": 2, "ref": "REF_A", "description": "bbbb2"}
{"_id": 3, "ref": "REF_A", "description": "cccc3"}
{"_id": 4, "ref": "REF_B", "description": "dddd1"} <- reset count because ref changed
{"_id": 5, "ref": "REF_B", "description": "eeee2"}
...

流水号在这里连接到描述字段。一旦“ref”发生变化,连接数计数器应重置并再次从 1 开始。当按“_id”排序时,所有相同的引用都已经在一起了。订单很重要。

我一直在寻找聚合来解决这个问题,但似乎我需要一种方法来引用以前的文档,但我还没有弄明白。

我能找到的最好的是这个线程: Add some kind of row number to a mongodb aggregate command / pipeline但似乎不适合我在某种情况下重置行号的情况。

最佳答案

查询1

  • 按引用和描述排序
  • 按 ref 分组并收集每个 ref-group 的文档
  • 映射将每个成员的索引添加到描述中
  • unwind替换root,重置初始结构
  • 您需要在管道的末尾添加$out 阶段(请参阅您的驱动程序如何执行此操作),以将其保存到新集合中,然后替换您现在拥有的集合。 (即使使用管道,我们也不能在任何更新方法中使用组)(唯一的办法是$out或者$merge,但是merge会比较慢)
  • 同时设置{allowDiskUse : true}

Test code here

aggregate(
[{"$sort": {"ref": 1, "description": 1}},
{"$group": {"_id": "$ref", "docs": {"$push": "$$ROOT"}}},
{"$set":
{"docs":
{"$map":
{"input": {"$range": [0, {"$size": "$docs"}]},
"in":
{"$let":
{"vars": {"doc": {"$arrayElemAt": ["$docs", "$$this"]}},
"in":
{"$mergeObjects":
["$$doc",
{"description":
{"$concat":
["$$doc.description",
{"$toString": {"$add": ["$$this", 1]}}]}}]}}}}}}},
{"$unwind": "$docs"},
{"$replaceRoot": {"newRoot": "$docs"}}])

*在 MongoDB 5 中,我们有 $setWindowFields,但你有 MongoDB 4.4,所以我们只有 $group 我想,试一试,但你有很多文件。

查询2

  • 需要 >= MongoDB 5,你现在没有
  • 你再次需要 $out

Test code here

aggregate(
[{"$setWindowFields":
{"partitionBy": "$ref",
"sortBy": {"description": 1},
"output": {"rank": {"$rank": {}}}}},
{"$set":
{"description": {"$concat": ["$description", {"$toString": "$rank"}]},
"rank": "$$REMOVE"}}])

关于文档子集中的 MongoDB 流水号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70336587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com