使用upsert语法更新mongodb(node)

时间:2014-11-20 03:57:23

标签: node.js mongodb mongodb-query

我正在使用节点mongodb模块MongoClient方法。

我的mongodb集合包含如下结构的记录:

{ 
    "_id" : ObjectId("546d64103e53563b506433df"), 
    "type" : "staticCollection", 
    "features" : [ 
        { 
            "type" : "static", 
            "properties" : { 
                "source" : "sometext", 
                "timestamp" : "1416455167", 
                "id" : "47759600", 
                "msgType" : 54, 
                "name" : null, 
                "data" : "some data string" 
            }
        } 
    ] 
}

当我收到“id”项已经存在的数据时,我想更新“properties”中包含的所有项目。

如果不存在“id”匹配,我想插入整个记录。

我想使用up with up来执行此操作。

我很难理解db.collection.update命令的语法是什么。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您正在寻找$setOnInsert。如果找不到要素项,假设您要设置整个文档,它将如下所示:

var propertiesId = req.query.propertiesId; // or however you're getting it
var allProperties = {} ; //set the full properties from the request etc
db.collection.update(
  { features : { $elemMatch: { 'properties.id' : propertiesId } } },
  { $set : { 'features.$.properties': allProperties },
    $setOnInsert: { 
        type: "staticCollection",
        features: [ { type: "static", properties: allProperties } ]
    }
  },
  { upsert: true }
)

答案 1 :(得分:1)

假设集合名称为:features。你可以试试这个:

db.features.update({"_id" : ObjectId("546d64103e53563b506433df")}, { "type" : "staticCollection", "features" : [ { "type" : "static", "properties" : { "source" : "sometext", "timestamp" : "1416455167", "id" : "47759600", "msgType" : 54, "name" : null, "data" : "some data string 2" } } ] }, true)

这一切应该在一行上,我把它们放在很多行上,以便于阅读。 查询末尾的true表示这是upsert