2

次のフォームのオブジェクトがあります。

{
    "_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);
4

2 に答える 2

4

これはgroups配列であるため機能しませんが、その中のプロパティをオブジェクトのように参照しています。これらは配列内の特定の項目を参照するため、groups.0.membersまたはのようなものにアクセスできますが、オブジェクト自体には追加する属性がありません。groups.1.membersgroupsmembers

更新で正確に何をする必要があるかは完全にはわかりませんがgroups.groupName、クエリにフィルターを追加してから、一致$pushgroups.$.membersたグループにのみメンバーを追加することができます。

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

于 2012-05-04T22:09:31.493 に答える
4

これは、ユーザー モデルが複数のグループを持つことができるため、フィルターでグループを一致$させ、更新で位置演算子を使用する必要があるためです。したがって、更新は次のようになります(テストされていません):

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

値の配列がある場合、位置演算子は基本的に「配列内の一致する値の位置で」と言います。

ただし、これは 1 レベルの配列の深さでしか実行できないため、たとえば、特定のグループ内の特定のメンバーを照合することはできません。このようなことをする必要があります。

于 2012-05-04T22:11:04.170 に答える