如何从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"] }
}
}
}
}
}
])