Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何从MongoDB中的所有子数组中删除元素_Arrays_Mongodb_Mongodb Query - Fatal编程技术网

Arrays 如何从MongoDB中的所有子数组中删除元素

Arrays 如何从MongoDB中的所有子数组中删除元素,arrays,mongodb,mongodb-query,Arrays,Mongodb,Mongodb Query,如何删除“newFor”中的所有“aFHJBrKu54y5mWjY3” 试着这样做,但它不起作用 Messages.update({ users: { $all: ["CnugxoBWs4ox6vG2k", "aFHJBrKu54y5mWjY3"] } }, { $pull: { "

如何删除“newFor”中的所有“aFHJBrKu54y5mWjY3”

试着这样做,但它不起作用

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