使用多个条件在mongodb中更新嵌套数组中的对象

时间:2013-12-09 15:47:39

标签: arrays mongodb

mongo中的示例文档如下所示,但是我的集合有几千个文档,其中一些文档具有以下所有测试,有些只有以下测试的子集:

{
"_id" : ObjectId("52435f0f6f73205f7d37a2b0"),
"ID" : {
    "schoolID" : "1234"
},
"institution" : {
    "tests" : [
        {
            "test" : "SAT Math",
            "25th_percentile" : null,
            "mean" : 404,
            "50th_percentile" : null,
            "75th_percentile" : null
        },
        {
            "test" : "SAT Verbal",
            "25th_percentile" : null,
            "mean" : 355,
            "50th_percentile" : null,
            "75th_percentile" : null
        },
        {
            "test" : "SAT Writing",
            "25th_percentile" : null,
            "mean" : 363,
            "50th_percentile" : null,
            "75th_percentile" : null
        },
        {
            "test" : "SAT Composite",
            "25th_percentile" : null,
            "mean" : 1122,
            "50th_percentile" : null,
            "75th_percentile" : null
        },
        {
            "test" : "ACT Math",
            "25th_percentile" : null,
            "mean" : null,
            "50th_percentile" : null,
            "75th_percentile" : null
        },
        {
            "test" : "ACT English",
            "25th_percentile" : null,
            "mean" : null,
            "50th_percentile" : null,
            "75th_percentile" : null
        },
        {
            "test" : "ACT Reading",
            "25th_percentile" : null,
            "mean" : null,
            "50th_percentile" : null,
            "75th_percentile" : null
        },
        {
            "test" : "ACT Science",
            "25th_percentile" : null,
            "mean" : null,
            "50th_percentile" : null,
            "75th_percentile" : null
        },
        {
            "test" : "ACT Composite",
            "25th_percentile" : null,
            "mean" : null,
            "50th_percentile" : null,
            "75th_percentile" : null
        }
    ]
}
}

我目前收到了几所学校的单独数据,并希望更新ID为“schoolID”的文档,其中“test”为“ACT Composite”,“mean”为null。

我尝试了以下内容:

db.collection.update({$and:[{"ID.schoolID":"1234"},    {"institution.tests.$.test": "ACT Composite"}, {"institution.tests.$.mean": null}]}, {"$set":{"institution.tests.$.mean":"trial"}})

但是,该对象未更新。 我也尝试过使用$ elemMatch:

db.collection.update({$and:[{"ID.schoolID":"1234"},{"institution.tests": {$elemMatch:{"test": "ACT Composite", "mean":null}}}]},{"institution.tests.$.mean":"trial"})

当使用$ elemMatch时,我能够计算出这是真实的文件数量:

db.collection.find({"institution.tests":{$elemMatch:{"test":"ACT Composite", "mean":null}}}).count()

最后,我还尝试使用pymongo编写python脚本,将对象转换为pandas数据帧(因为我更熟悉如何使用数据框和“ifelse”在R中执行此操作,但是,我是只有更新“test”为“ACT Composite”且“mean”为null的特定对象时才会出现问题。

任何帮助将不胜感激! 先感谢您!

1 个答案:

答案 0 :(得分:2)

您可以按照以下方式执行此操作:

db.collection.update({“ID.schoolID”:“1234”,“institution.tests”:{$ elemMatch:{test:“ACT Composite”,mean:null}}},{$ set:{ “institution.tests。$。mean”:“trial”}})