Mongodb按对象数组键查询并替换键

8 浏览
0 Comments

Mongodb按对象数组键查询并替换键

如何查询具有昵称的所有人,并将昵称键替换为"nick"。数据集看起来像这样,有更多的字段和更多的文档。如果存在昵称对象,则其索引位置未知。

最终结果应该是:

{

_id: "robert",

properties: [

{

"kids": 3

},

{

"nick": "Bob"

},

{

"age": 45

}

]

}

{

_id: "alice",

properties: [

{

"kids": 3

},

{

"age": 45

}

]

}

{

_id: "joseph",

properties: [

{

"nick": "joe"

}

]

}

0
0 Comments

Mongodb查询对象数组中的键并替换键的问题是由于需要将集合(collection)中的字段properties.nickname更改为properties.nick而导致的。下面是解决该问题的方法。

首先,我们可以使用以下查询来完成任务:

db.collection.aggregate([

{

$addFields:{

"properties":{

$map:{

"input":"$properties",

"as":"property",

"in":{

$mergeObjects:[

"$$property",

{

"nick":"$$property.nickname"

}

]

}

}

}

}

},

{

$project:{

"properties.nickname":0

}

},

{

$out:"collection"

}

])

在这个查询中,我们使用了聚合操作符$addFields,$map和$mergeObjects来重命名字段。首先,我们使用$map操作符遍历properties数组,并使用$mergeObjects将新键nick添加到每个对象中。然后,我们使用$project操作符将原始的properties.nickname字段从输出中排除。最后,我们使用$out操作符将聚合输出重新写入到原始的collection中。

以下是在进行上述操作之前和之后的集合的示例数据:

**Before:**

{

"_id" : "robert",

"properties" : [

{

"kids" : 3

},

{

"nickname" : "Bob"

},

{

"age" : 45

}

]

}

{

"_id" : "alice",

"properties" : [

{

"kids" : 3

},

{

"age" : 45

}

]

}

{ "_id" : "joseph", "properties" : [ { "nickname" : "joe" } ] }

**After:**

{

"_id" : "robert",

"properties" : [

{

"kids" : 3

},

{

"nick" : "Bob"

},

{

"age" : 45

}

]

}

{

"_id" : "alice",

"properties" : [

{

"kids" : 3

},

{

"age" : 45

}

]

}

{ "_id" : "joseph", "properties" : [ { "nick" : "joe" } ] }

该方法在MongoDB 4.4版本中测试通过,但是否适用于其他版本尚不确定。

希望以上内容对您有所帮助!

0