在 MongoDB 中设置嵌套数组的过滤条件
若要设置过滤条件,请在 MongoDB aggregate() 中使用 $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" } ] } ] } }
广告