MongoDB没有删除行,使用c#驱动程序没有错误
本文关键字:驱动程序 有错误 使用 删除行 MongoDB | 更新日期: 2023-09-27 18:21:48
我现在有一个奇怪的问题。我有一个聊天室风格的场景,创建了一个"房间",然后每个房间都有聊天的"条目"。
现在我有一个可以删除房间的web服务,它会通过其id删除"房间",然后删除任何具有相同"房间id"的"条目"。
因此,模式的一个例子是:
public class Room
{
Guid Id {get;set;}
Guid CreatorId {get;set;}
DateTime DateCreated {get;set;}
}
public class Entry
{
Guid Id {get;set;}
Guid RoomId {get;set;}
string Content {get;set;}
DateTime DateCreated {get;set;}
}
在上面的场景中,它成功地删除了房间,但未能删除该房间的所有条目,但查询没有返回错误。
查询基本上是:
var roomQuery = New QueryDocument(new BsonElement("Id", currentRoomId));
var roomResult = roomsCollection.Remove(roomQuery );
if(roomResult .Ok == false)
{ throw new Exception(roomResult .Message); }
var entriesQuery = New QueryDocument(new BsonElement("RoomId", currentRoomId));
var entriesResult = entriesCollection.Remove(entriesQuery );
if(entriesResult .Ok == false)
{ throw new Exception(entriesResult .Message); }
调用currentRoomId时,currentRoomId已经在上下文中,因为它用于删除成功删除的房间而没有错误。然而,当调用entriesCollection时,它会返回OK为true且没有错误,但记录不会被删除。。。我丢失的这些东西有什么问题吗?
在我的场景中,有2个条目要删除,还有1个房间。如前所述,房间已删除,2个条目未删除。
===编辑===
通过控制台在数据库中搜索后,以下是数据的存储方式:
/* 0 */
{
"_id" : new BinData(3, "/yTE1cDMh0W39IIBueAXdA=="),
"Id" : new BinData(3, "/yTE1cDMh0W39IIBueAXdA=="),
"RoomId" : new BinData(3, "xnDcYz2A5kyT5CdYRMSmig=="),
"Content" : "Some Test Content",
"DateCreated" : ISODate("0001-01-01T00:00:00Z")
}
在尝试做一个类似的查找后:
db.entry.find({ "RoomId" : "63dc70c6-803d-4ce6-93e4-275844c4a68a" }).limit(50);
我得到了0场比赛,我有点困惑为什么。。。这是因为Mongo存储字段的方式,所以它将尝试进行文本匹配并失败,而不是二进制匹配或值匹配等?
如果我要做:
db.entry.find({ "RoomId" : CSUUID("63dc70c6-803d-4ce6-93e4-275844c4a68a") }).limit(50);
我得到了匹配项,但我不知道如何在.net 中推断出这种类型
最终找到了导致这种情况的原因!
像所有好的问题一样,这是由我引起的,因为我的依赖项注入配置都设置正确,并且指向了正确的集合,但是在测试中,它指向的不是"Entries"集合,而是"Entry"。
即使在我使用GUI检查表值时,它也没有点击,并且发送的查询看起来很好。
无论如何,使用GUID等进行搜索没有问题,这只是转移注意力,所以至少现在问题已经解决了,我希望这能帮助其他像我这样的白痴:)