我有一个具有以下形式的对象:
{
"_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);发布于 2012-05-05 06:09:31
这是行不通的,因为groups是一个数组,但是引用其中的属性就好像它是一个对象一样。您可以访问诸如groups.0.members或groups.1.members之类的内容,因为它们引用了数组中的特定项,但是groups对象本身没有可追加的members属性。
我不完全确定您的更新需要做什么,但是您可以在查询中添加一个关于groups.groupName的过滤器,然后使用groups.$.members执行$push,以便只将一个成员附加到匹配的组中。
http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator
发布于 2012-05-05 06:11:04
这是因为您的用户模型可以有多个组,因此您需要匹配筛选器中的组,并在更新中使用位置运算符$。所以你的更新应该是这样的(未测试的):
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"
}
}
});当你有一个值数组时,位置运算符基本上是说“在数组中匹配值的位置”。
但是,您只能执行这一级别的数组深度操作,因此无法匹配特定组中的特定成员-因此,如果您需要执行此类操作,则可能需要将文档拆分成多个更简单的集合。
https://stackoverflow.com/questions/10456325
复制相似问题