0

给定学校对象的这种结构:

{ 
  "grade_spans" : 
  {
       "0": { 
         "grade_span_key" : "K_5",
         "name":  "Elementary School"
       }, 
       "1": { 
         "grade_span_key" : "6_8",
         "name":  "Junior High-School"
       }
  }
}

如何为给定的 Grade_span_key 找到学校?

db.schools.find({ "grade_span_key": "K_5" }) 

返回空。

更新:对不起,我错误地复制了结构。它实际上是一个嵌入式对象而不是一个集合。

更新 #2:我使用了一个不正确的原则 2 注释:@MongoDB\EmbedMany(strategy="set")。我将策略更改为 pushAll (这是默认设置)

4

3 回答 3

0

您应该使用属性的完整路径,以点分表示。

> db.schools.find({"grade_spans.grade_span_key": "K_5"})
{
    "_id" : ObjectId("50801cc5ab582e310adc0e41"),
    "grade_spans" : [
        {
            "grade_span_key" : "K_5",
            "name" : "Elementary School"
        },
        {
            "grade_span_key" : "6_8",
            "name" : "Junior High-School"
        }
    ]
}
于 2012-10-18T15:15:19.947 回答
0

如果此字段只是嵌入到主文档中,@sergios 答案将可以正常工作,并且不清楚为什么他的查询不起作用,因为您没有提供仅嵌入结构的文档结构示例。

同样正如@JohnnyHK 所说,将该对象重建为一个数组,因为在这种情况下动态键会更难。

如果您正在寻找从嵌入文档而不是完整文档中挑选出匹配的行。这有点困难,但有可能:

db.schools.aggregate({
    {$unwind: "$grade_spans"}, 
    {$match: {"grade_spans.grade_span_key": "K_5"}}, 
    {$group: {_id: "$_id", grade_spans: {$push: "$grade_spans"}}}
})

像上面这样的东西应该返回结构的文档:

{
    _id: {},
    grade_spans:[{
        "grade_span_key" : "K_5",
        "name" : "Elementary School"        
    }]
}
于 2012-10-18T15:37:30.320 回答
0

鉴于这种结构:

{ 
    "grade_spans" : {
        "0": {  "grade_span_key" : "K_5",
                "name":  "Elementary School" }, 
        "1": {  "grade_span_key" : "6_8",
                "name":  "Junior High-School" }
    }
}

您可以尝试使用 map/reduce 功能:

var mapFunction = function() {
    for (var i in this.grade_spans) {
        // Add the name of the school in a list
        var schools = [];
        schools[0] = this.grade_spans[i].name;

        // Create out object : { schools : ["Elementary School"] } or { schools : ["Junior High-School"] }
        var out = {};
        out.schools = schools;

        // Create key (K_5 or 6_8)
        var key = this.grade_spans[i].grade_span_key;
        emit(key, out);
    }
};


var reduceFunction = function(key, values) {
    var schools = [];
    for (var i = 0; i < values.length; i++) {
        schools.push.apply(schools, values[i].schools);
    }
    return {schools:schools};
}

db.schools.mapReduce(
    mapFunction,
    reduceFunction,
    { out: "map_reduce_grade_spans", sort: {_id:1} }
)

进而 :

db.map_reduce_grade_spans.find({_id:"K_5"});
于 2013-09-23T12:47:01.967 回答