Json mongoDB:使用点表示法更新对象(多级对象)

Json mongoDB:使用点表示法更新对象(多级对象),json,mongodb,syntax,mongodb-query,mongodb-update,Json,Mongodb,Syntax,Mongodb Query,Mongodb Update,我有一个具有以下形式的对象: { "_id": ObjectId("4fa43f4d1cf26a6a8952adf1"), "userId": "1", "facebookId": "1234", "groups": [{ "groupName": "testGroup", "members": [{ "memberFirstName": "userFirstName", "membe

我有一个具有以下形式的对象:

{
    "_id": ObjectId("4fa43f4d1cf26a6a8952adf1"),
    "userId": "1",
    "facebookId": "1234",
    "groups": [{
        "groupName": "testGroup",
        "members": [{
            "memberFirstName": "userFirstName",
            "memberLastName": "userLastName",
            "memberDetails": {
                "userId": "1",
                "faceBookId": "1234"
            }
        }]
    }]
}
它是为每个用户及其组保存的集合, 每个组都包含组成员。。。 所以“groups”键是一个数组(或列表),“members”键也是。 (每个用户可以有多个组,每个组有多个组成员)

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

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);

这不起作用,因为
groups
是一个数组,但您正在引用其中的属性,就像它是一个对象一样。您可以访问
组。0.成员
组。1.成员
,因为它们引用数组中的特定项,但
对象本身没有要附加的
成员
属性

我不完全确定您的更新需要做什么,但您可以在查询中添加
组.groupName
上的筛选器,然后对
组执行
$push
。$.members
将成员仅附加到匹配的组


这是因为您的用户模型可以有多个组,因此您需要在筛选器中匹配一个组,并在更新中使用位置运算符
$
。因此,您的更新应该是这样的(未经测试):

当您有一个值数组时,位置操作符基本上会说“在数组中匹配值的位置”


但是,您只能执行一级数组深度,因此无法匹配特定组中的特定成员,例如,如果需要这样做,您可能希望将文档拆分为多个更简单的集合。

当前的答案解释了为什么您无法更新您尝试的方式。但我想补充一点,我认为如果将“组”设计成一个对象,其中键是groupName,值是group对象,那么会容易得多。既然你想这样频繁地访问他们,我会考虑的,谢谢你的建议!好极了!它起作用了!只需要让它通过java驱动程序工作,非常感谢!
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"
        }
    }
});