mongodb - 当任何字段名称与字符串列表中的任何项目匹配时删除 MongoDB 文档
问题描述
我可以删除具有与给定字符串列表中的任何项目匹配的字段的 MongoDB 文档吗?例如,我想从以下演示中删除包含单词 ['Garbage', 'spam', 'useless'] 的子文档:
{
_id: 24752893,
dictionary: {
word1: {
language: ....,
count: ....,
},
word2: {
language: ....,
count: ....,
},
word3: {
language: ....,
count: ....,
},
....
}
},
{
_id: 6786765789,
dictionary: {
word1: {
language: ....,
count: ....,
},
word3: {
language: ....,
count: ....,
},
garbage: {
language: ....,
count: ....,
},
....
}
},
........
{
_id: 76675567,
dictionary: {
spam: {
language: ....,
count: ....,
},
useless: {
language: ....,
count: ....,
},
word2: {
language: ....,
count: ....,
},
....
}
}
我想保持其余的话不变。当字段值与列表中的任何项目匹配时,我已经看到了许多解决方案。有没有办法将字段名称与字符串列表中的项目匹配?
解决方案
解决方案#1:
let filter = ["garbage", "spam", "useless"];
db.dictionaris.aggregate([
{
$addFields: {
dictionary: {
$arrayToObject: {
$filter: {
input: { $objectToArray: "$dictionary" },
as: "item",
cond: {
$not: [{ $in: ["$$item.k", filter] }]
}
}
}
}
}
},
{
$out: "dictionaris"
}
]);
注意:$out
:获取聚合管道返回的文档并将它们写入指定的集合。$out 运算符必须是管道中的最后一个阶段。
解决方案 #2:对于 MongoDB 版本 >= 4.4
let filter = ["garbage", "spam", "useless"];
db.dictionaris.updateMany({},
[
{
$set: {
dictionary: {
$arrayToObject: {
$filter: {
input: { $objectToArray: "$dictionary" },
as: "item",
cond: {
$not: [{ $in: ["$$item.k", filter] }]
}
}
}
}
}
}
]
);
测试数据:
/* 1 */
{
"_id" : 24752893,
"dictionary" : {
"word1" : {
"language" : "Some word",
"count" : "Some word"
},
"word2" : {
"language" : "Some word",
"count" : "Some word"
},
"word3" : {
"language" : "Some word",
"count" : "Some word"
}
}
},
/* 2 */
{
"_id" : 6786765789,
"dictionary" : {
"word1" : {
"language" : "Some word",
"count" : "Some word"
},
"word3" : {
"language" : "Some word",
"count" : "Some word"
},
"garbage" : {
"language" : "Some word",
"count" : "Some word"
}
}
},
/* 3 */
{
"_id" : 76675567,
"dictionary" : {
"spam" : {
"language" : "Some word",
"count" : "Some word"
},
"useless" : {
"language" : "Some word",
"count" : "Some word"
},
"word2" : {
"language" : "Some word",
"count" : "Some word"
}
}
}
输出:
/* 1 */
{
"_id" : 24752893,
"dictionary" : {
"word1" : {
"language" : "Some word",
"count" : "Some word"
},
"word2" : {
"language" : "Some word",
"count" : "Some word"
},
"word3" : {
"language" : "Some word",
"count" : "Some word"
}
}
},
/* 2 */
{
"_id" : 6786765789,
"dictionary" : {
"word1" : {
"language" : "Some word",
"count" : "Some word"
},
"word3" : {
"language" : "Some word",
"count" : "Some word"
}
}
},
/* 3 */
{
"_id" : 76675567,
"dictionary" : {
"word2" : {
"language" : "Some word",
"count" : "Some word"
}
}
}
推荐阅读
- django - Django - UserManager(BaseUserManager) - 问题 - 为什么电子邮件和用户名不会打印到终端?
- python - 在 Python 的用户函数中同时传递多个数据帧作为参数
- java - 数组中 N 个元素的绝对差的最大和
- presto - Presto 查询以根据特定列中的值排除行
- r - 如何使用 R 运行具有大而稀疏数据矩阵的验证性因子分析模型?
- sql - 如何进行循环 SUM() 金额?
- batch-file - 如何获取使用 PSEXEC 命令启动的批处理的返回码?
- excel - 如何隐式调用类的默认函数
- jquery - 如何将 HTML AJAX 响应保存在 var 中?
- c# - 使用 Microsoft.AspNetCore.ApiAuthorization.IdentityServer 时如何在 JWT 和用户主体中添加自定义用户声明