【问题标题】:Mongodb conditional query search under an array数组下的MongoDB条件查询搜索
【发布时间】:2020-11-21 12:09:10
【问题描述】:

我有一个数据,其中有一个数组。在那个数组下有许多对象数组。我提到原始数据,以便任何人猜测结构

{
 _id: ObjectId(dfs45sd54fgds4gsd54gs5),
 content: [
 {
  str: "Hey",
  isDelete: false 
 },
 {
  str: "world",
  isDelete: true
 }
]
}

所以我想搜索任何匹配的字符串,并且我在数组下进行了顶部搜索。

所以我的查询是这样的:

let searchTerm = req.body.key;
db.collection.find(
 {
  'content.str': {
    $regex: `.*\\b${searchTerm}\\b.*`,
    $options: 'i',
   }
 }
)

所以这将返回数据。现在由于某种原因,我必须搜索 isDelete: false 的数据。

现在它返回数据是否 isDelete 是真/假,因为我没有提到条件。

任何人都可以帮助我解决这个问题以通过条件获取数据。我只希望这个到 Mongodb 查询。

非常感谢任何帮助。

【问题讨论】:

  • 您可以在正则表达式中使用前瞻断言。示例 - (world).*\s+(?=isDelete: false)。所以首先正则表达式寻找世界,当它找到它然后它开始寻找 isDelete: false 然后它只在条件满足时才返回匹配,否则它不会导致匹配
  • @rootkonda 感谢您的回复,我试过了,但不起作用
  • 你能把你试过的贴在这里吗?
  • 让 searchTerm = ${req.body.key}.*\s+(?=isDelete: false); db.collection.find( { 'content.str': { $regex: .*\\b${searchTerm}\\b.*, $options: 'i', } } )

标签: regex mongodb search


【解决方案1】:

您可以在此处添加另一个条件为 belo

db.test2.find({
  $and: [
    {
      "content.str": {
        $regex: "hey",
        $options: "i",
        
      }
    },
    {
      "content.isDelete": false
    }
  ]
},
{
    'content.$':1 //Projection - to get only matching array element
})

【讨论】:

  • 我试过这个但它不起作用,因为这个搜索是在数组下运行的。如果它喜欢直接进入(没有嵌套结构),那么它可以工作。我试过了
  • 您能解释一下直接进入是什么意思吗?
  • 像普通的键和值(普通的 JSON 结构)。无论如何,我再次尝试了这个,但这将返回其 isDelete: true 值的条目,因为我假设该条目已从数据库中删除
  • @Gibbs 我很兴奋,这个位置运算符在投影中是如何工作的?
  • 我试过了,但它就像我在问题上提到的一样。我在投影时返回主 _id。因此,如果删除该关键字,则响应返回空数组,因为在前端显示中找不到数据。我也试过你的条件和投影,但没有用。我也很惊讶为什么这件事没有发生
【解决方案2】:

$elemMatch 运算符匹配包含数组字段且至少有一个元素匹配所有指定查询条件的文档,

db.collection.find({
  content: {
    $elemMatch: {
      isDelete: true,
      str: {
        $regex: `.*\\b${searchTerm}\\b.*`,
        $options: "i"
      }
    }
  }
},
{
  "content.$": 1
})

工作场所:https://mongoplayground.net/p/VkdWMnYtGA3

【讨论】:

  • @Aks 您认为提供的答案中是否有某些内容无法解决您的问题?如果是这样,那么请对答案发表评论,以阐明究竟需要解决哪些尚未解决的问题。
猜你喜欢
  • 1970-01-01
  • 2016-03-21
  • 2015-06-29
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多