2012-05-04 6 views
1

を使用してオブジェクトを更新:のMongoDB:私は次の形式を持つオブジェクトを有するドット表記(マルチレベル・オブジェクト)

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

現在の回答は、あなたが試行している方法を更新できない理由を説明しています。しかし、「グループ」をオブジェクトとして設計した場合、キーがgroupName、値がグループオブジェクトである場合には、もっと簡単になるだろうと付け加えたいと思います。あなたは頻繁にこの方法でアクセスしたいと思っているようです。 – jdi

+0

私はそれを考慮する、アドバイスのおかげで! – IRousso

答えて

4

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

私はあなたの更新が正確に行うために必要なものは全くわからないんだけど、あなたはあなたのクエリにgroups.groupNameにフィルタを追加し、その後にのみマッチしたグループにメンバーを追加するgroups.$.members$pushを行うことができます。

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

+0

ええ、それは、ありがとう! – IRousso

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つのレベルを行うことができますので、あなたは、例えば、特定のグループ内の特定のメンバーと一致することはできません - あなたはにあなたの文書を分割することもできますあなたがこの種のことをする必要があるならば、より単純なコレクションの数。

+0

甘い!できます !ちょうどそれがjavaドライバを介して動作するようにする必要があります ありがとう! – IRousso

関連する問題