MongoDB C#驱动程序:使用Linq获取Guid返回空值

4

以下是我使用的查询数据库的代码。变量 "filter" 是一个 linq 表达式。似乎可以使用此代码使用 ObjectId 或文档中可能存在的任何其他值获取数据。但是,当我存储一个 Guid 并尝试检索它时,没有返回结果。这里是否有什么问题,或者在涉及 Guid 时 MongoDB 本身是否存在限制?

        _dbSet = mongoDatabase.GetCollection(collectionName);
        var query = _dbSet.AsQueryable<TEntity>();

        if (filter != null)
        {
            query = query.Where(filter);
        }

        return query.ToList();

编辑:

再进一步澄清一下。我已经尝试了这里最后一条评论中提供的解决方案:MongoDB和Linq Where子句中的Guid。但是,这并没有给我任何结果。我正在尝试检索的数据仅包含_id字段。

{
    "_id" : LUUID("e5bdda3b-ae6a-d942-bd43-c8c7a6803096")
}

用于检索此对象的实体仅具有名为Id的属性,据我了解,它对应Mongo文档中的_id字段。因此,我还尝试使用Id属性进行检索,但仍没有结果。


filter是什么,同样的过滤器在MongoDB控制台中是否会给您所需的结果? - Brandon Buck
筛选器是Expression<Func<TEntity,bool>>。我发现Mongo将Guid存储为某种二进制数据。我并不真的关心在shell中查询,只是使用c#驱动程序。 - jjkim
关于在 shell 中运行它的问题更多是针对以下方面的询问:在你尝试弄清楚为什么 C# 没有返回你认为应该得到的结果之前,你的查询是否实际上会提供这些结果。这可能是一个测试过程,取决于你的筛选器是否映射到标准查询。 - Brandon Buck
啊,好的。从我所了解的来看,在shell中的查询与在代码中的查询看起来会有所不同。特别是因为我正在使用Linq进行查询。更不用说,在将要传递到shell中的Find之前,我需要对我想要查找的Guid进行某种转换。我特别想使用Linq并执行以下操作以获取文档。entity=>entity.Id == Guid - jjkim
嗯,我没有做过任何C# Mongo的事情,但是我知道使用Node.js包装器时,ID会作为ObjectID返回(至少在我使用它时是这样),因此搜索ID需要将GUID字符串包装成new ObjectID(myGuidString)以执行查询。再次强调,这可能不适用于C#,但这是一个想法。 - Brandon Buck
这根本行不通,因为ObjectIds是96位而Guids是128位。从Guid到ObjectId会有数据丢失。这意味着从数据库中提取数据时,任何Id都不正确。 - jjkim
2个回答

4

作为对 @jjkim 回答的扩展,因为我无法在评论中发布图片:

您需要更改 "Studio 3T for MongoDB" 中的 "编辑 > 首选项" 下的偏好设置。

输入图像描述


谢谢!那非常有帮助。 - Daniel Lerps

3

这是我的错误。看起来返回的Guid在我使用的查看器中格式不正确。Robomongo喜欢默认为他们称之为LegacyUUID的东西,但这与.Net Guid的格式不同。我需要更改查看器中的选项,以便显示正确的Guid供我查找。


1
你改了什么? - Sunny Sharma
@SunnySharma,我回答有点晚了,抱歉。我已经很久没有使用Robomongo了。据我所记,它只是在UI中更改了UUID的格式。根据您下面的答案,看起来您已经找到了它。希望这能帮助其他陷入不同UUID格式陷阱的人。 - jjkim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接