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()吗?
答案 0 :(得分:1)
由于以下find
和elemMatch
的限制,无法直接使用elemMatch
和mongo array fields
。
$ elemMatch运算符将查询结果中字段的内容限制为仅包含与$ elemMatch条件匹配的第一个元素。 REF。来自$elemMacth
和mongo数组字段限制如下
投影文档中只能出现一个位置$运算符。
查询文档应该只包含要投影的数组字段的单个条件。多个条件可能在内部相互覆盖并导致未定义的行为。来自mongo array field limitations
的引用
因此,您尝试执行此操作后仅查找exam
或quiz
db.collectionName.find({"_id":22,"scores":{"$elemMatch":{"type":"exam"}}},{"scores.$.type":1}).pretty()
仅显示exam
得分数组。
否则你应该通过aggregation