要设置过滤条件,请在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" } ] } ] } }