首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用MongoDB和C#驱动程序查询子文档集合

如何使用MongoDB和C#驱动程序查询子文档集合
EN

Stack Overflow用户
提问于 2012-05-06 11:16:50
回答 1查看 8.4K关注 0票数 4

我有以下结构:

代码语言:javascript
运行
复制
public class ThreadDocument
{
    public ThreadDocument()
    {
        Messages = new List<Message>();
        Recipients = new List<Recipient>();
    }

    [JsonIgnore]
    public ObjectId Id { get; set; }
    public IList<Recipient> Recipients { get; set; }
    public IList<Message> Messages { get; set; }
    public DateTime LastMessageSent { get; set; }
    public string LastSentByUserName { get; set; }
    public string LastSentAvatarUrl { get; set; }
    public string Snippet { get; set; }
    public int MessageCount { get; set; }

}

public class Recipient
{
    public string UserId { get; set; }
    public int Status { get; set; }
}

public class Message
{
    public string FromUserId { get; set; }
    public string FromUsername { get; set; }
    public string FromAvatarUrl { get; set; }
    public DateTime Sent { get; set; }
    public string Text { get; set; }
}

当我保存的时候,它会产生类似这样的结果:

代码语言:javascript
运行
复制
{
  "_id" : ObjectId("4fa5eab4bfeddf23fcd01e4a"),
  "Recipients" : [{
      "UserId" : "4fa5d4d8bfeddf23fc72e590",
      "Status" : 1
    }, {
      "UserId" : "4fa5d4f9bfeddf23fc72e592",
      "Status" : 0
    }],
  "Messages" : [{
      "FromUserId" : "4fa5d4d8bfeddf23fc72e590",
      "FromUsername" : "a",
      "FromAvatarUrl" : null,
      "Sent" : ISODate("2012-05-06T03:06:28.396Z"),
      "Text" : "b"
    }],
  "LastMessageSent" : ISODate("2012-05-06T03:06:28.395Z"),
  "LastSentByUserName" : "a",
  "LastSentAvatarUrl" : null,
  "Snippet" : "b",
  "MessageCount" : 1
}

我想做的是,如果已经创建了一个线程,使用相同的一个,并添加消息到该一个基于用户是否发送给相同的用户或反之亦然。

我认为这样的方法可以工作,但它返回null (没有值):

代码语言:javascript
运行
复制
var thread = threadHelper.Collection.Find(
    Query.And(Query.EQ("Recipients.UserId", user.Id), Query.EQ("Recipients.UserId", sendToUser.Id))
).SingleOrDefault();

我在想一个包含了所有的东西?还是什么都有?不太确定如何进行查询。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-06 11:22:56

试用ElemMatch

代码语言:javascript
运行
复制
var thread = threadHelper.Collection.Find(
    Query.And(
        Query.ElemMatch("Recipients", Query.EQ("UserId", user.Id)), 
        Query.ElemMatch("Recipients", Query.EQ("UserId", sendToUser.Id))
    )
).SingleOrDefault();
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10467825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档