我试图整理一个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();
});
}
});
});
由于
答案 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的定义位置,必须定义它在驱动程序扩展的帮助下。