【问题标题】:Remove final element of array in MongoID document - Rails删除 MongoID 文档中数组的最后一个元素 - Rails
【发布时间】:2021-07-02 10:26:17
【问题描述】:

我一直在尝试删除 MongoID 文档中数组的最后一个元素,但由于某种未知原因而苦苦挣扎。

我们在 MongoDB 中有一个文档:

{
    "_id" : ObjectId("606c774ff34c295ec7ac5eb7"),
    "child_table" : [ 
        {
            "_id" : ObjectId("606c7768f34c291171ac5ec2"),
            "string3" : "y"
        },
        {
            "_id" : ObjectId("606c7768f34c291171ac5ef6"),
            "string3" : "u"
        }
    ]
}

此文档包含在 record 中。

record = Record.find_by(:id=> "606c774ff34c295ec7ac5eb7")

我可以删除我正在处理的第二个元素:

record.child_table.delete_at(record.child_table.count-1)

这工作正常,数组child_table 的第二个元素被删除。好的。 但是,当我去删除数组中的最后一个元素时,代码运行没有错误,但我去检查 Mongo 中的文档,它仍然显示最后一个元素。

我也试过跑步:

self.unset(:child_table)

但这对我没有任何帮助。

请告诉我任何建议! 谢谢

【问题讨论】:

  • 从您的数据中删除不必要的字段,然后添加一个可运行的代码 sn-p 包含您遇到问题的插入和删除。
  • @D.SM 我已经从数据中删除了不必要的字段。这只是我遇到问题的删除。可运行代码 sn-p 是单行代码,在原始问题中。如前所述,当数组包含超过 1 个元素时,该行代码有效。
  • 我在您的问题中看不到任何可运行的代码。 “可运行”是指除您之外的其他人在他们的计算机上没有您的应用程序的其余部分。

标签: arrays ruby-on-rails mongodb mongoid


【解决方案1】:

使用$pop

$pop 运算符删除数组的第一个或最后一个元素。传递 $pop 值 -1 以删除数组的第一个元素,传递 1 以删除数组中的最后一个元素。

只有 1 个子元素的演示 - https://mongoplayground.net/p/eGLqEPUjUAV

带有 2 个子元素的演示 - https://mongoplayground.net/p/nxXBaqK-3RL

db.collection.update(
    { _id: ObjectId("606c774ff34c295ec7ac5eb7") },
    { $pop: { child_table: 1 } } // removes last element from the array
)

【讨论】:

  • 谢谢您的回答,我现在想知道,为什么我上面尝试的方法不起作用?是否可以不使用MongoID方法清空数组,然后保存模型?
【解决方案2】:

请参考https://stackoverflow.com/a/4588909/6462538

这里的技巧是首先取消设置数组中的最后一个元素,然后拉出该元素。考虑到我们的集合是用户下​​面的命令将删除数组的最后一个元素

var record= db.users.find({ _id: ObjectId("606c774ff34c295ec7ac5eb7") }).toArray();

var index= record[0].child_table.length-1;
var unsetelement = "child_table."+index;
unsetelement = unsetelement.toString();

db.users.update({ _id: ObjectId("606c774ff34c295ec7ac5eb7") }, {$unset : { unsetelement : 1 }}) 
db.users.update({ _id: ObjectId("606c774ff34c295ec7ac5eb7") }, {$pull : {"child_table" : null}})

【讨论】:

  • 谢谢你,但我很好奇,不运行 MongoID 命令就不可能吗?例如,当我简单地执行record.child_table.delete_at(0) 时,我可以看到在绑定中数组被清除,但是然后执行record.save 我可以在MongoDB 中看到数组仍然包含最终元素。
  • 如果您能看看我之前的评论,我将不胜感激。
  • @DanielLawton 如果不向数据库发送命令,您将无法更新数据库。
  • @TomSlabbaert 我明白这一点,但我不明白为什么在 record.child_table.delete_at(0) 后跟 record.save 不会删除数组中的最后一个元素。我可以在delete_at 之后的代码中添加一个绑定,并且可以看到该数组是空的。运行 record.save 后,数组在 Mongo 中仍然相同
猜你喜欢
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 2014-12-09
  • 2021-11-24
  • 1970-01-01
相关资源
最近更新 更多