【问题标题】:removing embedded documents by ObjectId通过 ObjectId 删除嵌入的文档
【发布时间】:2019-06-20 20:28:08
【问题描述】:

我一次只能删除(拉取)一个嵌入文档(此处为“项目”)。

在我的示例中,“toRemove”是一个 ObjectIds 数组(cart.items)。

 db.collection('users').updateOne(
    { _id: new ObjectId(this._id) }, 
    {$pull: {'cart.items': {'productId': toRemove}}}
  )

这不起作用。

但如果我这样做toRemove[0],它只会删除第一个文档。 我怎样才能一次将它们全部删除?

【问题讨论】:

  • 请添加您的架构,以便我们更好地帮助您。
  • mongodb 是无模式的,那是什么意思?
  • 我知道 mongodb 是无模式的,但人们经常使用模式只是为了确保他们的集合/文档的结构。这就是我问的原因。简单来说,我可以看看你的文档结构吗?

标签: mongodb


【解决方案1】:

我认为您需要使用$pullAll 而不是$pull 从数组中删除所有匹配的实例。

db.collection('users').updateOne(
    { _id: new ObjectId(this._id) }, 
    {$pullAll: {'cart.items': {'productId': toRemove}}}
  )

阅读更多关于$pullAll here

【讨论】:

  • $pullAll 不起作用。它接受一个数组。 $pullAll: [...]
  • { $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } } 。我不想从主要收藏中撤出。我想提取嵌入的文档。
【解决方案2】:

我需要使用特殊的“$in”属性来删除所有“productId”在“toRemove”数组中的“items”:

return db.collection('users').updateOne(
    { _id: new ObjectId(this._id) },
    {$pull: {'cart.items': {'productId': { "$in": toRemove }}}}
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2011-04-11
    • 2013-03-24
    • 2012-05-15
    相关资源
    最近更新 更多