【问题标题】:Querying a subfield in documentdb查询 documentdb 中的子字段
【发布时间】:2019-07-18 13:56:46
【问题描述】:

例如,我在下面有一个收集 = 交付的文档:

{
    "doc": [
        {
            "docid": "15",
            "deliverynum": "123",
            "text": "txxxxxx",
            "date": "2019-07-18T12:37:58Z"
        },
        {
            "docid": "16",
            "deliverynum": "456",
            "text": "txxxxxx",
            "date": "2019-07-18T12:37:58Z"
        },
        {
            "docid": "17",
            "deliverynum": "999",
            "text": "txxxxxx",
            "date": "2019-07-18T12:37:58Z"
        }
    ],
    "id": "123",
    "cancelled": false
}

是否可以使用 "deliverynum" = 999 进行搜索,输出如下所示?

{
    "doc": [        
        {
            "docid": "17",
            "deliverynum": "999",
            "text": "txxxxxx",
            "date": "2019-07-18T12:37:58Z"
        }
    ],
    "id": "123",
    "cancelled": false
}

或者我应该为 Doc 部分制作另一个 Collection?

我无法在 C# 中针对这种情况进行查询。

【问题讨论】:

  • 您希望doc 是一个数组还是一个普通文档?
  • @RakshithSm 它是一个数组对象是的。 1 个交付 ID = 许多文档

标签: c# mongodb mongodb-.net-driver aws-documentdb


【解决方案1】:

在 Mongo shell 中,您可以使用 $(projection) 运算符:

db.collection.find({ "doc.deliverynum": "999" }, { "doc.$": 1 })

相应的 C# 代码如下所示:

var q = Builders<Model>.Filter.ElemMatch(x => x.doc, d => d.deliverynum == "999");
var p = Builders<Model>.Projection.ElemMatch(x => x.doc, d => d.deliverynum == "999");

var data = Col.Find(q).Project(p).ToList();

如果您想获取所有文档,即使不包含deliverynum =``999,也可以使用q = Builders&lt;Model&gt;.Filter.Empty

【讨论】:

  • 嗨@mickl,谢谢。如果我可以添加另一个问题,我如何为 Delivernum = 999 添加一个排序并获得最新日期的排序。鉴于我的文档可以有多个交付 = 999?此外,如果仍然可以保留我的模型类型,因为使用投影会将其转换为 Bson。
  • @Sid 这是可能的,但解决方案将完全不同。您能否打开一个单独的问题并将其链接到此处?今天晚些时候我会试着看看它
  • 嘿,使用这个答案,我怎样才能投影到 ModelChild 而不仅仅是 Model?我想用标准计算数据库中有多少 ModelChilld。我也为此提出了一个问题:stackoverflow.com/questions/58572968/…
  • 您可以使用$replaceRoot,但为了更简单,只需运行Col.Find(q).Project(p).ToList().Select(d =&gt; d.doc),因为您知道数据库只会返回这个子文档
  • 好的,我去:DbSet.AsQueryable().SelectMany(x => x.Comments).Where(where).Count();但这会在内存上运行还是在数据库上运行?
猜你喜欢
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多