如何从MongoDb中删除这些嵌入文档?

如何从MongoDb中删除这些嵌入文档?,mongodb,Mongodb,我有一个字段,它是嵌入式文档的字典(我希望我的术语是正确的)。我正在尝试删除所有键不是abc的嵌入文档(从此词典中) 这个mongo脚本非常有用: db.getCollection("users").update( {}, { $unset: { "prefs.state.AAAA": "", "prefs.state.BBBB

我有一个字段,它是嵌入式文档的字典(我希望我的术语是正确的)。我正在尝试删除所有键不是
abc
的嵌入文档(从此词典中)

这个mongo脚本非常有用:

db.getCollection("users").update(
    {},
    {
        $unset: 
        { 
            "prefs.state.AAAA": "",
            "prefs.state.BBBB": "",
            "prefs.state.CCCC": "",
        } 
    },
    {
        multi: true
    }
);
我这里的问题是,我实际上不知道这个字典列表中所有可能的键

在上面的例子中,我有

  • AAAA
  • BBBB
  • 中交
但我还可以再吃一堆

下面是一个合法文档示例:

{ 
    "_id" : 1.0, 
    "prefs" : {
        "state" : {
            "abc123" : { // TO STAY
                "name" : "name1", 
                "age" : 1.0
            }, 
            "AAAA" : { // TO BE REMOVED
                "name" : "name2", 
                "age" : 2.0
            }, 
            "XASDASD" : { // TO BE REMOVED
                "name" : "name3", 
                "age" : 3.0
            }
        }
    }
}
{ 
    "_id" : 2.0, 
    "prefs" : {
        "state" : {} // NO DATA, but this is OK
    }
}
{ 
    "_id" : 3.0, 
    "prefs" : {
        "state" : {
            "CCCC" : { // TO BE REMOVED
                "name" : "name4", 
                "age" : 4.0
            }
        }
    }
}

所以我想做的是:

如果
prefs.state.
不等于
abc123
,则此嵌入的文档应该被屏蔽

因此,考虑到上面的mongo脚本,它将找到
prefs.state.AAAA
并取消设置该字段,这基本上会破坏嵌入的文档

这可能吗


更新1:这是shell输出(显示失败)。我在应用程序“Studio 3T”中运行了这个

脚本:

db = db.getSiblingDB("users");


db.getCollection("jussytest").updateMany(
    {},
    [
        {
            $set: {
                "prefs.state": {
                    $arrayToObject: {
                        $filter: {
                            input: { $objectToArray: "$prefs.state" },
                            as: "x",
                            cond: { $eq: ["$$x.k", "abc123"] }
                        }
                    }
                }
            }
        }
    ]);
    
 db.getCollection("jussytest").find({});
    
结果:

MongoDB shell version v4.0.16
connecting to: mongodb://localhost:27017/users
Implicit session: session { "id" : UUID("1ae46c5b-a711-4f56-adb4-5e5f8a093750") }
MongoDB server version: 4.4.3
WARNING: shell and server versions do not match
users
authenticated
users
2021-03-10T09:17:43.659+1100 E QUERY    [js] Error: the update operation document must contain atomic operators :

DBCollection.prototype.updateMany@src/mongo/shell/crud_api.js:625:1

@(shell):1:1

The find query will be run with Query Assist.

尝试此更新管道(确保不要尝试生产数据):


谢谢你的回复-非常感谢。你自己试过吗?我无法让它在mongodb shell中运行。出现错误:
错误:更新操作文档必须包含原子运算符
。我在一个测试数据库上做了这件事,我很快就开始了,用那些3倍的文档。@Pure.Krome是的,我测试了它。我猜你是在看mongo的最新版本。如果我没有弄错的话,我相信管道更新支持是在版本4.2中添加的。如果您的mongo版本>=4.2,则您的she'll版本可能是最新版本mongodb docker image上的old.im。嗯。我会用shell输出更新帖子。@Pure.Krome看起来你需要更新shell<代码>v4.0.16不支持管道更新。命令起作用了。天啊。认真地就像我说的,我不是很讨厌你,而是讨厌这个工具有多复杂
db.users.updateMany(
    {},
    [
        {
            $set: {
                "prefs.state": {
                    $arrayToObject: {
                        $filter: {
                            input: { $objectToArray: "$prefs.state" },
                            as: "x",
                            cond: { $eq: ["$$x.k", "abc123"] }
                        }
                    }
                }
            }
        }
    ])