以下是我的电影架构:
"_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
]
}
]
我的查询是显示所有显示时间(shows.timings)大于20且位置为kurla的影院。我正在使用nodeJS。 查询如下:
user.aggregate([{$match:{"location":"kurla"}},{"$addFields": {"shows": {"$map": {"input": "$shows","as": "resultm","in": {"name": "$$resultm.name","mname": "$$resultm.mname","timings": {"$filter": {"input": "$$resultm.timings","as": "resultf","cond": {"$gte": ["$$resultf",10]}}}}}}}}])
当它获得 location =" kurla" 的完全匹配时,这可以正常工作,但我希望即使位置它也可以工作并显示相同的记录= kurla east,maharashthra,mumbai 。即使在我的收藏品的location属性中找到了部分匹配。这怎么办呢!请帮忙。感谢:)
答案 0 :(得分:0)
使用$regex
运算符对location
属性应用部分文本匹配。
替换此......
{$match:{"location":"kurla"}}
......用这个:
{ $match: {location: { $regex: /^kurla/ } } }
在上面的示例中,条件为location like 'kurla%'
。
更多详情in the docs。
这假设您希望过滤的值都在location
字段中,这与您问题中的以下陈述一致:
location = kurla east,maharashthra,mumbai
没有" maharashthra"或"孟买"然而,在您展示的示例文档的location
字段中," maharashthra"确实显示在address
属性中,因此,如果您的过滤器实际应用于location
和/或address
,则解决方案将与我上面发布的内容不同。如果是这种情况,也许您可以更新您的问题以澄清。