只显示满足条件的嵌套数组中的元素在mongodb中?

以下是我的moviedb集合:

"_id" : ObjectId("59b9501600fcb397d6acd5bb"), "theatreid" : 2, "name" : "carnival cinemas", "location" : "kanjulmarg", "address" : "sec 2,kanjul, Mumbai, Maharashtra 400703", "shows" : [ { "mname" : "bareily ki barfi", "timings" : [ 10, 13, 14, 16, 22 ] }, { "mname" : "Toilet:ek prem katha", "timings" : [ 8, 9, 14, 16, 20, 23 ] } ] "_id" : ObjectId("59b9506500fcb397d6acd5bc"), "theatreid" : 3, "name" : "pheonix pvr", "location" : "kurla", "address" : "sec 26,kurla, Mumbai, Maharashtra 400701", "shows" : [ { "mname" : "shubh mangal savdhan", "timings" : [ 9, 11, 15, 18, 20 ] }, { "mname" : "Toilet:ek prem katha", "timings" : [ 8, 9, 14, 16, 20, 23 ] } ] 

我想用电影的时间显示节目(假设它是24小时制)大于14(下午2时)。 我使用了下面的查询:

 db.moviedb.find( {"shows.timings": {$gt:14}}, {shows: {$elemMatch: {timings:{$gt: 14}}}}).pretty() 

它给出了以下输出:

实际

  "_id" : ObjectId("59b94fc900fcb397d6acd5ba"), "shows" : [ { "mname" : "bareily ki barfi", "timings" : [ 10, 13, 15, 17, 21 ] } ] "_id" : ObjectId("59b9501600fcb397d6acd5bb"), "shows" : [ { "mname" : "bareily ki barfi", "timings" : [ 10, 13, 14, 16, 22 ] } ] 

但是,正如所观察到的,它也显示了那些不满足条件的元素(如10,13)。 我只想要只显示那些满足结果的元素。 我想要以下面的方式输出。

预期

  "_id" : ObjectId("59b94fc900fcb397d6acd5ba"), "shows" : [ { "mname" : "bareily ki barfi", "timings" : [ 15, 17, 21 ] } ] "_id" : ObjectId("59b9501600fcb397d6acd5bb"), "shows" : [ { "mname" : "bareily ki barfi", "timings" : [ 16, 22 ] } ] 

这是我使用$ filter后得到的输出,但是如果我手动input数组,它会工作的很好。

  db.moviedb.aggregate([ { $project: { " shows.timings": { $filter: { input: "$shows.timings", as: "item", cond: { $gte: [ "$$item", 22 ] } } } } } ]) "_id" : ObjectId("59b94fc900fcb397d6acd5ba"), " shows" : { "timings" : [ [ 10, 13, 15, 17, 21 ], [ 8, 11, 14, 17, 20, 22 ] ] } } "_id" : ObjectId("59b9501600fcb397d6acd5bb"), " shows" : { "timings" : [ [ 10, 13, 14, 16, 22 ], [ 8, 9, 14, 16, 20, 23 ] ] } } "_id" : ObjectId("59b9506500fcb397d6acd5bc"), " shows" : { "timings" : [ [ 9, 11, 15, 18, 20 ], [ 8, 9, 14, 16, 20, 23 ] ] } } 

需要做什么? 请help.Thanks 🙂

尝试下面的聚合查询。

 db.moviedb.aggregate( [ { "$addFields": { "shows": { "$map": { "input": "$shows", "as": "resultm", "in": { "name": "$$resultm.name", "timings": { "$filter": { "input": "$$resultm.timings", "as": "resultf", "cond": { "$gte": [ "$$resultf", 14 ] } } } } } } } } ] )