【问题标题】:MongoDB, NodeJS: updating an embedded document with new membersMongoDB,NodeJS:使用新成员更新嵌入式文档
【发布时间】:2015-05-27 09:49:20
【问题描述】:

使用:MongoDB 和本机 nodeJS mongoDB 驱动程序。

我正在尝试解析来自 fb graph api 的所有数据,将其发送到我的 API,然后将其保存到我的数据库中。

在我的服务器中进行 PUT 处理:

    //Update user's data
app.put('/api/users/:fbuser_id/:category', function(req, res) {
    var body = JSON.stringify(req.body);
    var rep = /"data":/;
    body = body.replace(rep, '"' + req.params.category + '"' + ':');
    req.body = JSON.parse(body);
    db.fbusers.update({
            id: req.params.fbuser_id
        }, {
            $set: req.body
        }, {
            safe: true,
            multi: false
        },
        function(e, result) {
            if (e) return next(e)
            res.send((result === 1) ? {
                msg: 'success'
            } : {
                msg: 'error'
            })
        });
});

我一次发送 25 个元素,这段代码只是覆盖而不是更新文档。

我发送到 API 的数据:

    {
  "data": [
    {
      "category": "App page", 
      "name": "SoundCloud", 
      "id": "7919071058", 
      "created_time": "2013-09-16T18:16:59+0000"
    }, 
    {
      ...and so on
    }
    ]
    }

基本上,我的 API 将“数据”键从发送的 json 更改为类别名称,例如: PUT 到 /api/users/000/likes 会将“data”键更改为“likes”:

    {
  "likes": [
    {
      "category": "App page", 
      "name": "SoundCloud", 
      "id": "7919071058", 
      "created_time": "2013-09-16T18:16:59+0000"
    }, 
    {
      ...and so on
    }
    ]
    }

然后这个 JSON 被放到数据库中。

mongodb 中的层次结构:

        {
        "_id": ObjectID("556584c8e908f0042836edce"),
        "id": "0000000000000",
        "email": "XXXX@gmail.com",
        "first_name": "XXXXXXXX",
        "gender": "male",
        "last_name": "XXXXXXXXXX",
        "link": "https://www.facebook.com/app_scoped_user_id/0000000000000/",
        "locale": "en_US",
        "name": "XXXXXXXXXX XXXXXXXXXX",
        "timezone": 3,
        "updated_time": "2015-05-26T18:11:59+0000",
        "verified": true,
        "likes": [
            {
                "category": "App page",
                "name": "SoundCloud",
                "id": "7919071058",
                "created_time": "2013-09-16T18:16:59+0000"
            }, 
            {
                "category": "App page",
                "name": "SoundCloud",
                "id": "7919071058",
                "created_time": "2013-09-16T18:16:59+0000"
            },
            {
               ....and so on
            }
            ]
        }

所以问题是我的 api 用新发送的数据覆盖了字段(在本例中为“喜欢”),而不是将其附加到现有的数据文档中。

我很确定我应该在更新中使用“$put”以外的其他参数,但是,我不知道是哪一个以及如何以编程方式将参数传递给它。

【问题讨论】:

  • 是的,但是我需要以编程方式传递键和值。即使服务器运行 - 当数据发送到 PUT 路由处理程序时我也会崩溃。由于我的错误,它很有可能崩溃嘿。因此,我想看看其他人会如何解决这个问题

标签: json node.js facebook mongodb mongodb-query


【解决方案1】:

使用$push with the $each modifier 将多个值附加到数组字段。

var newLikes = [
  {/* new item here */},
  {/* new item here */},
  {/* new item here */},
];

db.fbusers.update(
  { _id: req.params.fbuser_id },
  { $push: { likes: { $each: newLikes } } }
);

另请参阅$addToSet 运算符,它将一个值添加到数组中,除非该值已经存在,在这种情况下 $addToSet 对该数组没有任何作用。

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多