我有如下 struct 的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'}的水果.

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

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

推荐答案

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

try 以下查询:

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

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

每当需要对同一个键应用同一运算符两次时,都需要使用$or$and.

Mongodb相关问答推荐

MongoDB:就地分组嵌套数组的元素

字段$set聚合导致错误美元($)前缀字段$concatArrays对于存储无效"

为什么这个查询可以在MongoDB中使用?

多键索引,性能问题

如何替换mongodb中的动态键?

增加嵌套对象中的值?

哪种 NoSQL DB 最适合 OLTP 金融系统?

如何检索 MongoDb 集合验证器规则?

MongoDB 聚合 $divide 计算字段

mongodb上不区分大小写的查询

在 URL 中使用 ID(来自 mongo 的 ObjectId)是否安全?

如何使用 MongoDB 建模 likes投票系统

MongoDB中超过2GB的数据库

如何从 node.js 以编程方式执行 mongodump 命令?

为什么使用 Redis 而不是 MongoDb 进行缓存?

MongoDB - 文件大小巨大且不断增长

使用 Jackson 与 Java Mongo DBObject 进行高效 POJO 映射

为什么我新创建的 mongodb 本地数据库增长到 24GB?

Meteor订阅不更新集合的排序顺序

在 MongoDB 中快速搜索数十亿个小文档的策略