使用点运算符设置MongoDB

时间:2015-02-10 17:57:31

标签: javascript node.js mongodb

我有一个3倍深的对象,我试图用

设置

这是开始的对象

{
    "_id": "53d905a709193fb6a0076fec",
    "active": 1,
    "article": null,
    "category_id": null,
    "clarification": null,
    "id": 5279,
    "language_id": 2,
    "master_id": 1667,
    "part_of_speech": "verb",
    "rank": 279,
    "word": "recordar",
    "hasSound": false,
    "extras": 0,
    "conjugations": {
        "present": [{
            "prefixes": {
                "1": "Yo"
            },
            "verb": "recuerdo",
            "grammar": "1PS"
        }],
        "preterite": [{
            "prefixes": {
                "1": "Yo"
            },
            "verb": "recordé",
            "grammar": "1PS"
        }, {
            "prefixes": {
                "2": "Tu"
            },
            "verb": "recordaste",
            "grammar": "2PS"
        }, {
            "prefixes": {
                "3": "El",
                "4": "Ella",
                "6": "Usted"
            },
            "verb": "recordó",
            "grammar": "3PS"
        }, {
            "prefixes": {
                "7": "Nosotros"
            },
            "verb": "recordamos",
            "grammar": "1PP"
        }, {
            "prefixes": {
                "9": "Ellos",
                "10": "Ellas",
                "11": "Ustedes"
            },
            "verb": "recordaron",
            "grammar": "3PP"
        }],
        "imperfect": [{
            "prefixes": {
                "1": "Yo"
            },
            "verb": "recordaba",
            "grammar": "1PS"
        }, {
            "prefixes": {
                "2": "Tu"
            },
            "verb": "recordabas",
            "grammar": "2PS"
        }, {
            "prefixes": {
                "3": "El",
                "4": "Ella",
                "6": "Usted"
            },
            "verb": "recordaba",
            "grammar": "3PS"
        }, {
            "prefixes": {
                "7": "Nosotros"
            },
            "verb": "recordábamos",
            "grammar": "1PP"
        }, {
            "prefixes": {
                "9": "Ellos",
                "10": "Ellas",
                "11": "Ustedes"
            },
            "verb": "recordaban",
            "grammar": "3PP"
        }],
        "future": [{
            "prefixes": {
                "1": "Yo"
            },
            "verb": "recordaré",
            "grammar": "1PS"
        }, {
            "prefixes": {
                "2": "Tu"
            },
            "verb": "recordarás",
            "grammar": "2PS"
        }, {
            "prefixes": {
                "3": "El",
                "4": "Ella",
                "6": "Usted"
            },
            "verb": "recordará",
            "grammar": "3PS"
        }, {
            "prefixes": {
                "7": "Nosotros"
            },
            "verb": "recordaremos",
            "grammar": "1PP"
        }, {
            "prefixes": {
                "9": "Ellos",
                "10": "Ellas",
                "11": "Ustedes"
            },
            "verb": "recordarán",
            "grammar": "3PP"
        }]
    }
}

这是$ set对象。 collection.update({id: id}, {$set: obj});

var obj = {
    "conjugations.present.0.prefixes.1": "Yo",
    "conjugations.present.0.verb": "recuerdo",
    "conjugations.present.0.grammar": "1PS"
}

1

然后这是更新后的对象

{
    "_id": "53d905a709193fb6a0076fec",
    "active": 1,
    "article": null,
    "category_id": null,
    "clarification": null,
    "id": 5279,
    "language_id": 2,
    "master_id": 1667,
    "part_of_speech": "verb",
    "rank": 279,
    "word": "recordar",
    "hasSound": false,
    "extras": 0,
    "conjugations": {
        "present": {
            "0": {
                "prefixes": {
                    "1": "Yo"
                },
                "verb": "recuerdo",
                "grammar": "1PS"
            }
        }
    }
}

由于某种原因,现在,变形是一个对象,而不是一个数组,它会杀死其余的变形对象。从文档看起来我应该能够使用"conjugations.present.0..."更新完整的共轭对象的特定部分,但是不是设置第0个数组元素,而是将它设置为具有键0的对象

1 个答案:

答案 0 :(得分:0)

首先,您需要为您的案例使用“$ set”运算符。而不是在conjugations.present[0]中设置每个键,为什么不重新定义整个conjugations.present[0]对象?我建议做以下事情:

db.yourcollection.update(
    {_id : "someId"}, 
    {$set : {"conjugations.present.0" : 
            {
                "prefixes": {
                    "1": "Yo"
                },
                "verb": "recuerdo",
                "grammar": "1PS"
            }
        }
    }
)

这将修改conjugations.present中的第0个元素。我将你的物品导入我的机器,为我工作。