1

聚合、$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" } ] }  

但这超越了type: 'exam'并且只返回type: 'quiz'。有人知道如何用db.find()做到这一点吗?

4

1 回答 1

1

这是不可能直接使用findand的,因为andelemMatch有以下限制。elemMatchmongo array fields

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

和 mongo 数组字段限制如下

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

查询文档应该只包含一个关于正在投影的数组字段的条件。多个条件可能会在内部相互覆盖并导致未定义的行为。来自mongo 数组字段限制的参考

因此,要么您尝试按照此进行查找,exam要么quiz

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

is 仅显示exam分数数组。

否则你应该通过aggregation

于 2015-04-16T11:02:18.697 回答