首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongoDB :使用点符号更新对象(多级对象)

mongoDB :使用点符号更新对象(多级对象)
EN

Stack Overflow用户
提问于 2012-05-05 05:23:47
回答 2查看 5.2K关注 0票数 2

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

代码语言:javascript
复制
{
    "_id": ObjectId("4fa43f4d1cf26a6a8952adf1"),
    "userId": "1",
    "facebookId": "1234",
    "groups": [{
        "groupName": "testGroup",
        "members": [{
            "memberFirstName": "userFirstName",
            "memberLastName": "userLastName",
            "memberDetails": {
                "userId": "1",
                "faceBookId": "1234"
            }
        }]
    }]
}

它是一个为每个用户保存的集合-它的组,每个组包含组成员...因此,"groups“键是一个数组(或列表),"members”键也是。(每个用户可以有多个组,每个组有多个组成员)。

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

代码语言:javascript
复制
db.collection.update({
    userId: "1"
}, {
    $push: {
        "groups.members": {
            membersDetails: {
                userId: "2",
                faceBookId: "54321"
            },
            memberFirstName: "UserB",
            memberLastName: "UserBLastName"
        }
    }
});

但它似乎不起作用。

出现以下错误:

代码语言:javascript
复制
can't append to array using string field name [members]

我也在尝试使用Java驱动程序,但似乎效果不佳。

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2012-05-05 06:09:31

这是行不通的,因为groups是一个数组,但是引用其中的属性就好像它是一个对象一样。您可以访问诸如groups.0.membersgroups.1.members之类的内容,因为它们引用了数组中的特定项,但是groups对象本身没有可追加的members属性。

我不完全确定您的更新需要做什么,但是您可以在查询中添加一个关于groups.groupName的过滤器,然后使用groups.$.members执行$push,以便只将一个成员附加到匹配的组中。

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

票数 4
EN

Stack Overflow用户

发布于 2012-05-05 06:11:04

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

代码语言:javascript
复制
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"
        }
    }
});

当你有一个值数组时,位置运算符基本上是说“在数组中匹配值的位置”。

但是,您只能执行这一级别的数组深度操作,因此无法匹配特定组中的特定成员-因此,如果您需要执行此类操作,则可能需要将文档拆分成多个更简单的集合。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10456325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档