假设我们有一个这样的集合:
{
_id:1,
tag:["speaker","tom"]
},
{
_id:2,
tag:["subject","tomatoes"]
}
{
_id:3,
tag:["subject","space"]
}
我可以查询特定元素,例如:
db.tags.find({tag:["speaker","tom"]})
现在是否可以使用与该数组的 second 元素匹配的正则表达式执行查询? 类似的东西:
db.tags.find({tag:["speaker",/tom.*/]}) ?
字段tag
上的正则表达式(即:db.tags.find({tag:/sp.*/})
)将与整个数组匹配,我正在寻找一种方法,使其仅在第二个上搜索...在考虑之前必须重组该集合。
更新
解决方法是使用$all
运算符:
db.tags.find({tag:{$all : ["speaker",/tom.*/]} })
相当于:
db.tags.find({ $and: [ { tag: "speaker }, { tags: /tom.*/ } ] }
然而,这不是正确的方法,因为两个元素都被扫描了字符串和正则表达式。
答案 0 :(得分:1)
请允许我兑换自己。我发现你可以使用聚合框架
这样做db.tags.aggregate([
{$match: {"tag.1" : {$exists: 1}}},
{$project: {one: {$slice: ["$tag", 1]}, two: {$slice: ["$tag", 1,2]}}},
{$match: {one: "speaker", two: /tom.*/}}
])
第一部分确保数组至少包含2个元素。项目第一个元素到one
,第二个元素到two
使用切片然后匹配每个数组中的单个元素。
然后,您可以获取ID并返回到原始集合并运行另一个查询或向此添加更多投影,并从聚合框架中提取必要的数据。