我知道其他用户已经问过这个问题。我测试它不起作用。当使用$ coll-> remove({“_ id”=>“xxxx”})而不是预期的时候,我发现了这个问题。
以下是我的测试摘要:
print Dumper $db->posts->find_one({"_id" => "4d92740b2239007c16130000"});
$ VAR1 = undef;
print Dumper $db->posts->find_one({"_id" => $conn->oid("4d92740b2239007c16130000")});
使用_id =>打印出一份文件“4d9274032e62007c16110000”
自动生成的_id对象是否可用于管理文档?
答案 0 :(得分:2)
http://www.mongodb.org/display/DOCS/Removing
db.things.remove({_id: myobject._id});
_id
不是字符串。它是一个12字节的二进制值,存储为BSON对象:
http://www.mongodb.org/display/DOCS/Object+IDs
您可以通过_id
删除,但不能使用24位十六进制字符串表示。这与您已经发现的find_one()
完全相同。
$coll->remove({"_id" => $myObject->{_id}});
答案 1 :(得分:0)
objectid和它的字符串表示之间有明显的区别。如果在这里实际使用ObjectId为_id,为什么第一个带有字符串表示形式的find_one()会返回结果?因此行为是完全正确的 - 与使用的驱动程序无关。如果您出于任何原因引入字符串对象ID,那么您将能够按字符串搜索。只要驱动程序注入了decicated objectid(不是字符串),你就必须通过它们而不是字符串表示来搜索。