我现在有点奇怪的问题。我有一个聊天室风格的场景,其中创建了“房间”,然后每个聊天室都有“条目”。MongoDB不删除行,没有错误使用C#驱动程序
现在我有一个可以删除房间的网络服务,它将通过它的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已经在上下文中时,它是用来删除它没有错误成功取出了房间,这是所谓的。但是,当entryCollection被调用时,它返回一个OK,没有错误,但记录不会被删除......这个东西有什么遗漏吗?
在我的场景中有2个条目要删除和1个房间。如前所述,房间被删除,2项不是。通过控制台在这里的DB搜索
== ==编辑
后是如何将数据存储:
/* 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中的'RoomId'值是否与传入查询的类型相同? – WiredPrairie
我在上面的模型中使用了ClassMap的AutoMap功能,所以它是相同的类型和名称,在MongoVue中,我可以看到行,并具有与Room相同的名称和值。 – Grofit
虽然你正在使用'QueryDocument'和'BsonElement',而不是强类型的版本(比如'Query'),那么如何考虑AutoMap功能呢? –
WiredPrairie