MongoDB:多个 $elemMatch

标签 mongodb pymongo

我的 MongoDB 文档结构如下:

{_id: ObjectId("53d760721423030c7e14266f"),
fruit: 'apple',
vitamins: [
    {
     _id: 1,
     name: 'B7',
     usefulness: 'useful',
     state: 'free',
    }
    {
     _id: 2,
     name: 'A1',
     usefulness: 'useful',
     state: 'free',
    }
    {
     _id: 3,
     name: 'A1',
     usefulness: 'useful',
     state: 'non_free',
    }
  ]
}
{_id: ObjectId("53d760721423030c7e142670"),
fruit: 'grape',
vitamins: [
    {
     _id: 4,
     name: 'B6',
     usefulness: 'useful',
     state: 'free',
    }
    {
     _id: 5,
     name: 'A1',
     usefulness: 'useful',
     state: 'non_free',
    }
    {
     _id: 6,
     name: 'Q5',
     usefulness: 'non_useful',
     state: 'non_free',
    }
  ]
}

我想查询并获取所有具有{name: 'A1', state: 'non_free'}的水果和 {name: 'B7', state: 'free'} . 在最坏的情况下,如果无法获取这些条目并且如果存在 pymongo 的等效代码,我至少希望计算这些条目,以便知道如何编写它。

对于给定的示例,我只想检索苹果(第一个)文档。

如果我使用 $elemMatch它仅适用于一种情况,但不适用于两种情况。例如。如果我查询 find({'vitamins': {'$elemMatch': {'name': 'A1', 'state': 'non_free'}, '$elemMatch': {'name': 'B7', 'state': 'free'}}})它将使用 {'name': 'B7', 'state': 'free'} 检索所有水果.

最佳答案

在这种情况下,您可以使用 $and-operator .

试试这个查询:

find({
    $and: [
         {'vitamins': {'$elemMatch': {'name': 'A1', 'state': 'non_free'} } },
         {'vitamins': {'$elemMatch': {'name': 'B7', 'state': 'free'} } }
    ]
});

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

当你需要两次对同一个键应用相同的操作符时,你需要使用$or$and

关于MongoDB:多个 $elemMatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25014699/

相关文章:

node.js - 如何使用 MongoDB/Mongoose 中的先前值更新字段

python - 是否可以在 Pymongo 中创建一个没有游标超时的聚合?

python - 如何使用 Azure 函数中的 pymongo 连接到 Cosmos DB

node.js - Mongoose 文本搜索与变音符号Sensitive

node.js - 通过任意排序来替代跳过和限制 Mongoose 分页

mongodb-query - PyMongo $ in + $ regex

mongodb - 我如何判断 MongoDB 中的查询是否有更多结果?

python - 如果 key 并不总是存在,如何在 mongodb 中找到_one?

mongodb - 仅当 MongoDB 中不存在时才创建用户(简单示例)

c# - 如何在不获取整个文档的情况下获取字段的值?