通过$ elemMatch在mongodb中提取两个子数组值

时间:2015-04-16 10:29:57

标签: mongodb sub-array

Aggregate,$ unwind和$ group不是我的解决方案,因为它们使查询非常慢,因为我希望通过db.collection.find()方法获取我的记录。

问题是我需要来自子数组的多个值。例如,从以下示例中,我想获得“type”:“exam”“type”:“quiz”元素。

{
    "_id" : 22,
    "scores" : [
        {
            "type" : "exam",
            "score" : 75.04996547553947
        },
        {
            "type" : "quiz",
            "score" : 10.23046475899236
        },
        {
            "type" : "homework",
            "score" : 96.72520512117761
        },
        {
            "type" : "homework",
            "score" : 6.488940333376703
        }
    ]
}

我看起来像

db.students.find(
// Search criteria
{ '_id': 22 },

// Projection
{ _id: 1, scores: { $elemMatch: { type: 'exam', type: 'quiz' } }}
)

结果应该像

{ "_id": 22, "scores" : [ { "type" : "exam", "type" : "quiz" } ] }  

但这超过了类型:'考试',只返回类型:'测验'。有人知道怎么用 db.find()吗?

1 个答案:

答案 0 :(得分:1)

由于以下findelemMatch的限制,无法直接使用elemMatchmongo array fields

  

$ elemMatch运算符将查询结果中字段的内容限制为仅包含与$ elemMatch条件匹配的第一个元素。 REF。来自$elemMacth

和mongo数组字段限制如下

  

投影文档中只能出现一个位置$运算符。

     

查询文档应该只包含要投影的数组字段的单个条件。多个条件可能在内部相互覆盖并导致未定义的行为。来自mongo array field limitations

的引用

因此,您尝试执行此操作后仅查找examquiz

db.collectionName.find({"_id":22,"scores":{"$elemMatch":{"type":"exam"}}},{"scores.$.type":1}).pretty()

仅显示exam得分数组。

否则你应该通过aggregation