【问题标题】:Delete a MongoDB subdocument by value按值删除 MongoDB 子文档
【发布时间】:2014-08-12 02:55:04
【问题描述】:

我有一个包含如下文档的集合:

{
    "user": "foo",
    "topics": {
        "Topic AB": {
            "score": 20,
            "frequency": 3,
            "last_seen": 40
        },
        "Topic BD": {
            "score": 10,
            "frequency": 2,
            "last_seen": 38
        },
        "Topic TF": {
            "score": 19,
            "frequency": 6,
            "last_seen": 20
        }
    }
}

我想删除 last_seen 值小于 30 的子文档。

我不想在这里使用数组,因为我使用$incupsert 一起更新子文档(不支持$ 表示法)。

这里真正的问题是如何根据键的值删除键。使用$unset 只需删除一个子文档,无论它包含什么。

【问题讨论】:

  • topics 是一个数组吗?
  • ma08 - 不,它是一个子文档,动态创建的键在此集合中的文档之间有所不同。

标签: mongodb


【解决方案1】:

恐怕我认为您目前的设计不可能做到这一点。知道要测试其last_seen 值的键的名称,例如Topic TF,您可以这样做

> db.topics.update({"topics.Topic TF.last_seen" : { "$lt" : 30 }}, 
                   { "$unset" : { "topics.Topic TF" : 1} })

但是,对于嵌入式文档结构,如果您不知道要查询的键的名称,则无法运行查询。如果主题 XX 键仅由文档中的内容知道,则您必须提取整个文档以找出要测试的键,此时您应该只在客户端操作文档,然后通过 @ 更新987654325@.

最好的选择是使用数组。 $ 位置运算符与 upserts 一起使用,它只是有一个严重的问题,在插入的情况下,$ 将被解释为字段名称的一部分而不是运算符,所以我理解你的结论这似乎不可行。不过,我不太确定你是如何使用 upsert 的,这样数组看起来就不起作用了。您能否在此处提供更多详细信息,我将尝试帮助您想出一个合理的解决方法来使用数组和 $ 与您的用例?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2020-10-12
  • 2014-06-23
  • 2015-05-15
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
相关资源
最近更新 更多