MongoDB中为嵌套数组设置过滤条件

要设置过滤条件,请在MongoDBgregation()中使用$filter和$cond。 $filter根据指定条件选择要返回的数组子集。 让我们创建一个包含文档的集合-

> db.demo725.insertOne(
...    {
...
...       "details": {
...
...          "userMessages": [
...             {
...                "Messages": [
...                   { "Message": "Hello" },
...                   { "Message": "How" },
...                   { "Message": "are" }
...                ]
...
...             },
...             {
...                "Messages": [
...                   { "Message": "Good" },
...                   { "Message": "Bye" }
...
...                ]
...             },
...             {
...                "Messages": [
...                   { "Message": "Hello" },
...                   { "Message": "Bye" }
...
...                ]
...
...             }
...          ]
...       }
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5eab16cd43417811278f5893")
}

在find()方法的帮助下显示集合中的所有文档-

> db.demo725.find();

这将产生以下输出-

{ "_id" : ObjectId("5eab16cd43417811278f5893"), "details" : { "userMessages" : [ { "Messages" : [ { "Message" : "Hello" }, { "Message" : "How" }, { "Message" : "are" } ] }, { "Messages" : [ { "Message" : "Good" }, { "Message" : "Bye" } ] }, { "Messages" : [ { "Message" : "Hello" }, { "Message" : "Bye" } ] } ] } }

以下是为嵌套数组设置过滤条件的查询-

> db.demo725.aggregate([
...    {
...       $addFields: {
...          "details.userMessages": {
...             $filter: {
...                input: "$details.userMessages",
...                as: "out",
...                cond: {
...                   $anyElementTrue: {
...                      $map: {
...                         input: "$$out.Messages",
...                         in: { $gte: [ { $indexOfBytes: [ "$$this.Message", "Hello" ] }, 0 ] }
...                      }
...                   }
...                }
...             }
...          }
...       }
...    }
... ]).pretty()

这将产生以下输出-

{
   "_id" : ObjectId("5eab16cd43417811278f5893"),
   "details" : {
      "userMessages" : [
         {
            "Messages" : [
               {
                  "Message" : "Hello"
               },
               {
                  "Message" : "How"
               },
               {
                  "Message" : "are"
               }
            ]
         },
         {
            "Messages" : [
               {
                  "Message" : "Hello"
               },
               {
                  "Message" : "Bye"
               }
            ]
         }
      ]
   }
}