为啥 mongodb 查询在数组中查找具有两个值的文档不起作用?

Posted

技术标签:

【中文标题】为啥 mongodb 查询在数组中查找具有两个值的文档不起作用?【英文标题】:Why mongodb query to find documents with two values in array does not work?为什么 mongodb 查询在数组中查找具有两个值的文档不起作用? 【发布时间】:2022-01-04 21:26:45 【问题描述】:

我需要找到包含数组“products”的 mongodb 文档,包括 both 值“value1”和“value2”。

为什么下面的第一个查询有效而第二个查询无效?

## First query: Correct

db.person.find(
    
        $and: [
         segment: /a/i ,
         products:  $elemMatch:  productType: /value1/i   ,
         products:  $elemMatch:  productType: /value2/i   
        ]
    
).count()

## Results: 474 (Correct)

## Second query: WRONG

db.person.find(
    
        segment: /a/i,
        products: 
            $elemMatch:  productType: /value1/i ,
            $elemMatch:  productType: /value2/i 
        
    
).count()

## Results: 698 (WRONG)

【问题讨论】:

对于第一个查询,您正在查询products 对象内的单个字段。对于第二个查询,您正在查询 整个对象,这将需要与整个 products 对象完全匹配。 谢谢!什么会将第二种情况变成对整个对象的查询?只是在“产品”中存在多个键吗?您能否就这个问题提供一些参考资料? 希望this official document对你有用:) 【参考方案1】:

一位朋友找到了关于为什么第二种情况不起作用的答案:

解释为什么您只收到符合第二个条件的结果:您传递给 MongoDB 的每个 内的对象都是键/值对。每个对象的每个键只能存在一次。当您尝试将值分配给同一个键两次时,第二次分配将覆盖第一次。在您的情况下,您为同一对象中的键 $elemMatch 分配了两个不同的值,因此第一个被忽略。实际到达MongoDB的查询只是find('vitamins': '$elemMatch': 'name': 'B7', 'state': 'free').

每当您需要将同一个运算符应用到同一个键两次时,您需要使用$or$and

来源:https://coderedirect.com/questions/343064/mongodb-multiple-elemmatch

【讨论】:

以上是关于为啥 mongodb 查询在数组中查找具有两个值的文档不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 oracle SQL 中,在条件相差很大的情况下,对同一列执行具有两个不同值的查询所花费的时间

Mongodb数组查询:查找数组中包含局外人的记录[重复]

MongoDb:查找具有重复项的精确数组匹配

MongoDB:获取具有两个值的不同组合的最新文档

为啥在与数组中的字段匹配时,mongoDB聚合中的查找中的管道不起作用?

Apache Drill 与 mongodb。在地图中查询具有特定键和值的文档