仅返回具有正则表达式匹配字段的对象

时间:2017-02-06 09:37:47

标签: mongodb

我的文档结构是,

{
  "objects" : {
    "obj1": {
      "name" : "AC",
      "prop1" : "val1",
      "prop2" : "val2"
    },
    "obj2": {
      "name" : "BC",
      "prop1" : "val1",
      "prop2" : "val2"
    },
    "obj3": {
      "name" : "AB",
      "prop1" : "val1",
      "prop2" : "val2"
    }
  }
}

我想在regex内的所有对象的name字段上执行objects匹配,并仅返回匹配的子对象。我尝试了以下match查询,

{
  $or: [{
    "object.obj1.name": {
      $regex: "searchText"
    }
  }, {
    "object.obj2.name": {
      $regex: "searchText"
    }
  }, {
    "object.obj3.name": {
      $regex: "searchText"
    }
  }]
}

这场比赛有效。但是我应该在select字段中给出什么?如果我给{"object.obj1": 1, "object.obj2": 1, "object.obj3": 1},则如果任何一个regex匹配通过,则将返回所有子对象。如何在不使用聚合的情况下有条件地执行select?是否可以不进行聚合?

谢谢,

1 个答案:

答案 0 :(得分:0)

在我得到答案之前,我想指出架构不太正确,如果你想要使用数组嵌套多个文档,这种方法会让你省去很多麻烦,相信我: / p>

{
  "objects" : [
    {
      "name" : "AC",
      "prop1" : "val1",
      "prop2" : "val2"
    },
    {
      "name" : "BC",
      "prop1" : "val1",
      "prop2" : "val2"
    },
    {
      "name" : "AB",
      "prop1" : "val1",
      "prop2" : "val2"
    }
  ]
}

现在,我想您希望过滤掉每个匹配文档的objects内的一些嵌套文档。遗憾的是,这是一个你应该使用聚合管道的情况。如果您对此不了解,则可以使用投影操作符仅过滤数组中的一个元素:$$elemMatch,但在这种情况下,您需要返回更多而不是一个。

这里是我认为符合您要求的汇总管道:

aggregation = [
  {
    // Match documents having at least one nested object with "A" in name
    $match: {
      "objects.name": {
        $regex: "A"
      }
    }
  },
  {
    $unwind: "$objects"
  },
  // Match all nested documents containing "A" in name
  {
    $match: {
      "objects.name": {
        $regex: "A"
      }
    }
  },
  // Groups nested documents to return them as individual documents.
  // Here you can add more fields and perform other operations if needed
  {
    $group: {
      "_id": "$objects.name"
    }
  }
]

db.collection.aggregate(aggregation)

我希望这可以帮助你,我不太清楚你希望查询输出的输出,但无论如何,我可能至少可以给你一个想法!祝你好运!