Mongo:匹配ObjectId

时间:2016-09-21 13:17:51

标签: javascript mongodb

我试图整理一个javascript函数来更新Mongo数据库。我认为匹配查询的最佳字段是b _id,但我在尝试使用所需的ObjectId()正确格式化查询时遇到问题。

我将12位十六进制数传递给函数,但我不确定如何将其格式化为Mongo将理解的对象ID。

我尝试过以下方法:

var thisId = new ObjectId(hexnumbergoeshere);

var thisId = "ObjectId(" + hexnumberinavargoeshere + ")";

这两个都会引发错误。

我尝试给匹配子句只是这样的十六进制数:

var myMatch = {_id:hexnumberinavargoeshere}

虽然这并没有产生错误,但实际上并没有更新数据库。

请有人指出我应该如何格式化并传递十六进制数字,以便它可以在我的查询中工作。

编辑以添加更完整的代码:

这是实际的路由器功能:

router.post('/edit', function(req,res){
    var theId = req.body.id;
    var idArray = theId.split("_");
    var thisField = idArray[1];
    var thisId = idArray[2];
    var theMatch = new ObjectId(thisId);
    var match = {_id:theMatch};
    var query = {$set:{thisField:req.body.value}};

    var MongoClient = mongodb.MongoClient;
    var url = 'mongodb://localhost:27017/gts';
    MongoClient.connect(url, function(err, db){
        if(err){
            console.log("Error connecting to the server",  err);
        }else{
            var collection = db.collection('events');
            collection.update(match,query, function(err, result){
                if(err){
                    console.log("Error inserting record", err);
                }else{
                    console.log("Update Success! " + result);
                    res.send(req.body.value);
                }
                db.close();
            });     
        }
    });
});

由于

3 个答案:

答案 0 :(得分:0)

在RoboMongo中我尝试了代码

db.getCollection('collectionName').find({"_id" : ObjectId("57e221ea368e723925160807")})

它对我有用

因此,当您从前端发送匹配表达式时,它应采用相同的格式。

答案 1 :(得分:0)

您可以在代码中进行以下更改并尝试。

 var match = {_id:ObjectId(theMatch)};

答案 2 :(得分:0)

ObjectId是一个包装器,不是javascript的一部分,它由您依赖的驱动程序用于连接到MongoDB。我曾经试图看看ObjectId结构是什么,结果驱动程序实现的方式是带有str字段的简单对象,所以ObjectId(“abc”)就像

{"str":"abc"}

你可以试一试

theMatch = {"str":thisId};

至于问题,我猜你的new ObjectId('whatever')无法正常工作,尝试在控制台上打印theMatch并看看它打印的内容,很可能你需要检查你的ObjectId的定义位置,必须定义它在驱动程序扩展的帮助下。