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