在 mongoDB 中删除数组字段大小小于 3 的文档

Posted

技术标签:

【中文标题】在 mongoDB 中删除数组字段大小小于 3 的文档【英文标题】:remove documents with array field's size less than 3 in mongoDB 【发布时间】:2012-05-13 11:14:54 【问题描述】:

我有一个名为 col 的 mongoDB 集合,它的文档看起来像这样


  
    intField:123,
    strField:'hi',
    arrField:[1,2,3]
  ,

  
    intField:12,
    strField:'hello',
    arrField:[1,2,3,4]
  ,

  
    intField:125,
    strField:'hell',
    arrField:[1]
  

现在我想从集合 col 中删除文档,其中数组字段的 size 小于 2。

所以我写了一个看起来像这样的查询

db.col.remove('arrField':"$size":"$lt":2)

现在这个查询没有做任何事情。我检查了db.col.find(),它返回了所有文件。这个查询有什么问题?

【问题讨论】:

【参考方案1】:

在 MongoDB 2.2+ 中,您可以在条件对象键中使用数字索引来执行此操作:

db.col.remove('arrField.2': $exists: 0)

这将删除arrField 中没有至少 3 个元素的任何文档。

【讨论】:

目前最好的解决方案,就我而言,我不想获取子数组长度大于 24 的文档 这是最干净的解决方案恕我直言【参考方案2】:

来自$size 的文档:

您不能使用 $size 查找大小范围(例如:具有超过 1 个元素的数组)。

如果您想尝试这种事情,文档建议维护一个单独的大小字段(在本例中为 arrFieldSize)和数组中的项目数。

【讨论】:

【参考方案3】:

请注意,对于某些查询,仅使用 (n)or 条件列出您想要包含或排除的所有计数可能是可行的。

在您的示例中,以下查询将提供少于 2 个数组条目的所有文档:

db.col.find(
  "$or": [
     "arrField": "$exists" => false ,
     "arrField": "$size" => 1 ,
     "arrField": "$size" => 0 
  ]
)

【讨论】:

但正如接受的答案所说,你不能范围查询 $size 所以这不起作用。 这绝对有效。这不是本机范围查询,它只是您感兴趣的所有 $size 值的普通旧 ORing。即而不是说“给我所有 arrField $size 0–2 的文档”,您可以要求“所有 arrField $size 0、arrField $size 1 或 arrField $size 2 的文档”。显然,这仅在您感兴趣的 $size 值范围很小的情况下才可行,但在这些情况下,它工作得很好,并且可能比添加 arrFieldSize 计数器或类似的更方便。 对,对不起-我的错误。如果您进行编辑,我可以删除我之前给出的答案。 谢谢。无论如何,我的原始格式很糟糕——所以我做了编辑。【参考方案4】:

以下应该可以工作

db.col.remove($where: "this.arrField.length < 2")

【讨论】:

以上是关于在 mongoDB 中删除数组字段大小小于 3 的文档的主要内容,如果未能解决你的问题,请参考以下文章

mongodb,

删除内部字段数组 MongoDb 的元素 [重复]

将数组中对象的字段添加到同一数组中对象的另一个字段MongoDB

mongodb更新查询删除命令中指定的字段以外的所有数组字段

mongodb更新查询删除命令中指定的字段以外的所有数组字段

Mongoose MongoDB 找到数组字段中数组长度最小的那个