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 中推断出这种类型

MongoDB没有删除行,使用c#驱动程序没有错误

最终找到了导致这种情况的原因!

像所有好的问题一样,这是由我引起的,因为我的依赖项注入配置都设置正确,并且指向了正确的集合,但是在测试中,它指向的不是"Entries"集合,而是"Entry"。

即使在我使用GUI检查表值时,它也没有点击,并且发送的查询看起来很好。

无论如何,使用GUID等进行搜索没有问题,这只是转移注意力,所以至少现在问题已经解决了,我希望这能帮助其他像我这样的白痴:)