MongodDB $只从数组中拉出一个元素

JVG*_*JVG 7 database arrays mongodb nosql

我有一个内部有数组的文档,如下所示:

"userTags" : [
        "foo",
        "foo",
        "foo",
        "foo",
        "moo",
        "bar"
    ]
Run Code Online (Sandbox Code Playgroud)

如果我执行,db.products.update({criteriaToGetDocument}, {$push: {userTags: "foo"}}}我可以正确插入foo数组的另一个实例.

但是,如果我这样做,db.products.update({criteriaToGetDocument}, {$pull: {userTags: "foo"}}}它会从数组中删除所有实例foo,让我:

"userTags" : [
        "moo",
        "bar"
    ]
Run Code Online (Sandbox Code Playgroud)

这根本不会做,我只想从数组中拉出一个项而不是全部.如何更改命令以便只foo删除一个命令?有什么$pullOnce方法可以在这里工作吗?

Sal*_*ali 4

不,目前还没有这样的事情。很多人已经请求了该功能,您可以在mongodb Jira中跟踪它。据您所见,它尚未解决,也未安排(这意味着您在不久的将来没有运气)。

唯一的选择是使用应用程序逻辑来实现这一点:

  1. 找到您想要的且 userTags 为 foo 的元素
  2. 遍历 userTags 并从中删除一个 foo
  3. 使用新的 userTags 更新该元素

请记住,此操作会破坏原子性,但由于 Mongo 没有提供执行此操作的本机方法,因此您将以任何方式破坏原子性。

我将一种替代解决方案移至新答案,因为它没有回答这个问题,但代表了重构现有模式的方法之一。它也变得如此之大,开始比原来的答案大得多。