这是我的示例代码:
DBCollection coll = db.getCollection("testCollection");
BasicDBObject search = new BasicDBObject("$search", "mytextsearch");
BasicDBObject textSearch = new BasicDBObject("$text", search);
BasicDBObject projection = new BasicDBObject("score", new BasicDBObject("$meta", "textScore"));
myDoc = coll.findOne(textSearch, projection);
这应该找到文件,我称之为myDoc,搜索“mytextsearch”得分最高。
然后,我想从集合中删除此文档,所以我做了:
coll.remove(myDoc);
但是,这对集合没有影响,永远不会删除myDoc。我究竟做错了什么?我希望能在找到之后删除myDoc。
答案 0 :(得分:1)
remove-method不会删除传递给它的文档。它会删除所有与传递的DBObject
相同的所有字段的文档。在这种情况下,为什么这种区别很重要?因为您使用投影来更改文档。
投影后,DBObject有一个新字段textScore=something
。然后,当您将该DBObject传递给.remove()
时,数据库将仅删除具有该确切值的字段textScore
的文档。由于集合中的原始文档没有此字段,因此不会被删除。
那你做什么呢?
创建一个新的BasicDBObject
,其中只包含您要删除的文档的_id
,而不包含其他内容。因为_id
字段始终是唯一的并且自动编入索引,所以这将是明确且快速的。然后将这一个传递给.remove
。