按值删除MongoDB子文档

时间:2014-08-11 14:18:04

标签: mongodb

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

{
    "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(不支持$表示法)一起更新子文档。< / p>

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

1 个答案:

答案 0 :(得分:0)

我担心我不相信你当前的设计是可行的。知道要测试last_seen值的密钥的名称,例如Topic TF,就可以了

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

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

最好的选择是使用数组。 _id位置运算符使用upserts,它只是有一个严重的问题,在插入的情况下,$将被解释为字段名称的一部分而不是作为运算符,所以我理解你的结论似乎不可行。我不太确定你是如何使用upsert的,因此数组似乎不会起作用。你能否在那里提供更多细节,我会尝试帮助提出一个合理的解决方法,在你的用例中使用数组和$