Arrays 如何从MongoDB中的所有子数组中删除元素
如何删除“newFor”中的所有“aFHJBrKu54y5mWjY3” 试着这样做,但它不起作用Arrays 如何从MongoDB中的所有子数组中删除元素,arrays,mongodb,mongodb-query,Arrays,Mongodb,Mongodb Query,如何删除“newFor”中的所有“aFHJBrKu54y5mWjY3” 试着这样做,但它不起作用 Messages.update({ users: { $all: ["CnugxoBWs4ox6vG2k", "aFHJBrKu54y5mWjY3"] } }, { $pull: { "
Messages.update({
users: { $all: ["CnugxoBWs4ox6vG2k", "aFHJBrKu54y5mWjY3"] }
},
{
$pull: {
"messages.$.newFor": "aFHJBrKu54y5mWjY3"
}
},
{ multi: true }
);
试一下我的答案:
查询:
db.collection.aggregate([
{
"$project": {
"messages": {
// for every element of messages array
"$map": {
"input": "$messages",
"as": "m",
"in": {
// keep id
"id": "$$m.id",
// keep addedAt
"addedAt": "$$m.addedAt",
// keep userId
"userId": "$$m.userId",
// keep message
"message": "$$m.message",
// for every element of newFor, remove based on filter
// $ne means "not equal"
"newFor": {
"$filter": {
"input": "$$m.newFor",
"as": "n",
"cond": {
"$ne": [
"$$n",
"aFHJBrKu54y5mWjY3"
]
}
}
}
}
}
}
}
}
])
[
{
"_id": "gQnYi2e54zADwgipx",
"messages": [
{
"addedAt": ISODate("2020-06-22T22:50:35.579Z"),
"id": "4d2219d05645a3991d3aae89",
"message": "Test",
"newFor": [
"CnugxoBWs4ox6vG2k"
],
"userId": "CnugxoBWs4ox6vG2k"
},
{
"addedAt": ISODate("2020-06-22T22:48:24.359Z"),
"id": "b42641118bb080cb9122062f",
"message": "Test 2",
"newFor": [],
"userId": "aFHJBrKu54y5mWjY3"
},
{
"addedAt": ISODate("2020-06-22T22:48:14.643Z"),
"id": "244e77bb8324dc0b0f0e2def",
"message": "Test 3",
"newFor": [],
"userId": "CnugxoBWs4ox6vG2k"
}
]
}
]
结果:
db.collection.aggregate([
{
"$project": {
"messages": {
// for every element of messages array
"$map": {
"input": "$messages",
"as": "m",
"in": {
// keep id
"id": "$$m.id",
// keep addedAt
"addedAt": "$$m.addedAt",
// keep userId
"userId": "$$m.userId",
// keep message
"message": "$$m.message",
// for every element of newFor, remove based on filter
// $ne means "not equal"
"newFor": {
"$filter": {
"input": "$$m.newFor",
"as": "n",
"cond": {
"$ne": [
"$$n",
"aFHJBrKu54y5mWjY3"
]
}
}
}
}
}
}
}
}
])
[
{
"_id": "gQnYi2e54zADwgipx",
"messages": [
{
"addedAt": ISODate("2020-06-22T22:50:35.579Z"),
"id": "4d2219d05645a3991d3aae89",
"message": "Test",
"newFor": [
"CnugxoBWs4ox6vG2k"
],
"userId": "CnugxoBWs4ox6vG2k"
},
{
"addedAt": ISODate("2020-06-22T22:48:24.359Z"),
"id": "b42641118bb080cb9122062f",
"message": "Test 2",
"newFor": [],
"userId": "aFHJBrKu54y5mWjY3"
},
{
"addedAt": ISODate("2020-06-22T22:48:14.643Z"),
"id": "244e77bb8324dc0b0f0e2def",
"message": "Test 3",
"newFor": [],
"userId": "CnugxoBWs4ox6vG2k"
}
]
}
]
$
仅匹配满足查询的第一个数组元素。由于您尚未在查询中为消息
指定任何条件,因此它将不匹配任何内容
为了从嵌套在messages
数组中的匿名对象中的每个newFor
数组中删除元素,您需要迭代messages
数组,并分别过滤每个newFor
数组
如果您使用的是MongoDB 4.2+,使用的是update database命令的管道形式,则只有在一个update命令中才能实现这一点
db.messages.update({},[
{$set:{
messages:{
$map:{
input:"$messages",
in:{
$mergeObjects:[
"$$this",
{newFor:{
$filter:{
input:"$$this.newFor",
as:"new",
cond:{$not:{$in:[
"$$new",
["aFHJBrKu54y5mWjY3","CnugxoBWs4ox6vG2k"]
]}}
}
}}
]
}
}
}
}}
])