我有一个包含如下文档的集合:
{
"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的子文档。
我不想在这里使用数组,因为我使用$inc
与upsert
(不支持$
表示法)一起更新子文档。< / p>
这里真正的问题是如何根据其值删除密钥。使用$unset
只会丢弃一个子文档,无论它包含什么。
答案 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的,因此数组似乎不会起作用。你能否在那里提供更多细节,我会尝试帮助提出一个合理的解决方法,在你的用例中使用数组和$
?