MongoDB的:使用点符号更新的对象(多级对象)(mongoDB : updating an ob

2019-09-17 01:27发布

我有以下形式的对象:

{
    "_id": ObjectId("4fa43f4d1cf26a6a8952adf1"),
    "userId": "1",
    "facebookId": "1234",
    "groups": [{
        "groupName": "testGroup",
        "members": [{
            "memberFirstName": "userFirstName",
            "memberLastName": "userLastName",
            "memberDetails": {
                "userId": "1",
                "faceBookId": "1234"
            }
        }]
    }]
}

这是保持每个用户的集合 - 它的组,包含组成员......因此,“组”,每个组密钥是一个数组(或列表),因此是“成员”键。 (每个用户可以有多个组,每个组具有多个组成员)。

我有一个很难用一个新的组成员更新对象,我想要做的是:

db.collection.update({
    userId: "1"
}, {
    $push: {
        "groups.members": {
            membersDetails: {
                userId: "2",
                faceBookId: "54321"
            },
            memberFirstName: "UserB",
            memberLastName: "UserBLastName"
        }
    }
});

但它似乎并没有工作。

得到了以下错误:

can't append to array using string field name [members]

我也想用Java驱动程序的工作,但是这似乎并没有正常工作。

DBObject query = new BasicDBObject("userId", "1");

DBObject newMemberDetailsObj = new BasicDBObject();
newMemberDetailsObj.put("userId", "2");
newMemberDetailsObj.put("faceBookId", "54321");

DBObject newMemberObj = new BasicDBObject();
newMemberObj.put("memberFirstName", "userB");
newMemberObj.put("memberLastName", "UserBLastName");
newMemberObj.put("memberDetails", newMemberDetailsObj );

DBObject update = new BasicDBObject("$push", new BasicDBObject("members", newMemberObj));
update.put("groupName", "testGroup");       

DBObject maintain = new BasicDBObject("$push", new BasicDBObject("groups", update));

WriteResult newWr = coll.update(query, maintain);

Answer 1:

这不会起作用,因为groups是一个数组,但你引用它的属性就好像它是一个对象。 你可以访问之类的东西groups.0.membersgroups.1.members ,因为这是指对数组中的特定项目,但groups对象本身没有一个members属性附加到。

我不能完全确定你的更新需要做什么,但你可以在过滤器添加groups.groupName到您的查询,然后执行$pushgroups.$.members为成员追加只匹配该组。

http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator



Answer 2:

这是因为你的用户模型可以有多个组,所以你需要在符合过滤条件的一组,并使用位置操作符$在更新。 所以,你的更新将是这样的(未经测试):

db.collection.update({
    userId: "1",
    "groups.groupName": "testGroup" // match against the group here
}, {
    $push: {
        "groups.$.members": { // notice the use of the $ here
            membersDetails: {
                userId: "2",
                faceBookId: "54321"
            },
            memberFirstName: "UserB",
            memberLastName: "UserBLastName"
        }
    }
});

当你有值的数组,位置操作基本上说“在数组中的匹配值的位置”。

但是 ,你只能做深阵列的这一个水平,这样你就不能特定成员在特定的组相匹配,例如-所以你可能需要将文件分解成若干简单的集合,如果你“再会需要做这样的事情。



文章来源: mongoDB : updating an objects using dot notation (multi-level object)