【问题标题】:Extract two sub array values in mongodb by $elemMatch通过$elemMatch在mongodb中提取两个子数组值
【发布时间】:2015-06-22 16:49:46
【问题描述】:

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" } ] }  

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

【问题讨论】:

    标签: mongodb sub-array


    【解决方案1】:

    这是不可能直接使用findelemMatch 因为elemMatchmongo array fields 的限制。

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

    和mongo数组字段限制如下

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

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

    所以要么你尝试按照这个来找出只有examquiz

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

    仅显示 exam 分数数组。

    否则你应该通过aggregation

    【讨论】:

    • 感谢@yogesh 的回复,请告诉我什么是最好的聚合方式,以减少查询时间。
    • 检查此stackoverflow.com/questions/2599943/… 或使用索引和分片
    • 我已经有了索引,但分片不是一个选项,我尝试了很多聚合选项,但展开使查询速度变慢,这就是我在 find() 中寻找任何解决方案的原因。
    • @SajjadAhmed 这可能会帮助你更好stackoverflow.com/questions/24018161/…
    • @SajjadAhmed 有什么可以帮助您的吗?你还有什么顾虑吗?
    猜你喜欢
    • 2012-11-07
    • 2017-05-28
    • 2015-05-15
    • 2013-09-03
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多