MongoDB:数组中特定元素的正则表达式

时间:2016-08-29 23:21:47

标签: arrays regex mongodb

假设我们有一个这样的集合:

{
  _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.*/ } ] }

然而,这不是正确的方法,因为两个元素都被扫描了字符串和正则表达式。

1 个答案:

答案 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并返回到原始集合并运行另一个查询或向此添加更多投影,并从聚合框架中提取必要的数据。