为啥 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 中,在条件相差很大的情况下,对同一列执行具有两个不同值的查询所花费的时间