首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子文档数组中的项目单字段返回多个

子文档数组中的项目单字段返回多个
EN

Stack Overflow用户
提问于 2022-06-19 18:59:29
回答 2查看 47关注 0票数 0

我很难在子文档数组中设置一个返回元素的代码。实际上,我正在尝试将一个文档简化为一个强类型的新文档。我的文件看上去像;

代码语言:javascript
复制
{ 
    "_id" : BinData(3, "7FRf4nbe60ev6XmGKBBW4Q=="), 
    "status" : NumberInt(1), 
    "title":"Central station",
     "attributes" : [
        {
            "defId" : BinData(3, "QFDtR03NbkqwuhhG76wS8g=="), 
            "value" : "388", 
            "name" : null
        }, 
        {
            "defId" : BinData(3, "RE3MT3clb0OdLEkkqhpFOg=="), 
            "value" : "", 
            "name" : null
        }, 
        {
            "defId" : BinData(3, "pPgJR50h8kGdDaCcH2o17Q=="), 
            "value" : "Merkez", 
            "name" : null
        }
    ]}

我想要实现的是;

代码语言:javascript
复制
{
  "title":"Central Station",
  "value":"388"
}

我已经做过的事;

代码语言:javascript
复制
  using (_dbContext)
        {
            var filter = Builders<CustomerModel>.Filter.Eq(q => q.Id, Guid.Parse("30B59585-CBFC-4CD5-A43E-0FDB0AE3167A")) &
                Builders<CustomerModel>.Filter.ElemMatch(f => f.Attributes, q => q.DefId == Guid.Parse("47ED5040-CD4D-4A6E-B0BA-1846EFAC12F2"));

            var projection = Builders<CustomerModel>.Projection.Include(f => f.Title).Include("attributes.value");
            var document = _dbContext.Collection<CustomerModel>().Find(filter).Project(projection).FirstOrDefault();
            if (document == null)
                return null;
            return BsonSerializer.Deserialize<TitleAndValueViewModel>(document);
        }

注意: TitleAndCodeViewModel包含标题和值属性。

这段代码返回;

代码语言:javascript
复制
{{ "_id" : CSUUID("30b59585-cbfc-4cd5-a43e-0fdb0ae3167a"), "title" : "388 güvenevler", "attributes" : [{ "value" : "388" }, { "value" : "" }, { "value" : "Merkez " }] }}

我试图获得“值”:“388”,但是我得到了另外两个值属性,甚至是为子文档添加的ElemMatch过滤器。

谢谢你提前提供帮助。

注意:我在C# mongodb驱动程序中寻找答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-19 19:46:56

备选案文1:(通过汇总)

代码语言:javascript
复制
db.collection.aggregate([
{
$match: {
  _id: 5,
  "attributes.defId": 1
  }
},
{
"$addFields": {
  "attributes": {
    "$filter": {
      "input": "$attributes",
      "as": "a",
      "cond": {
        $eq: [
          "$$a.defId",
          1
        ]
      }
    }
  }
}
},
{
  $unwind: "$attributes"
},
{
  $project: {
    _id: 0,
    title: 1,
    value: "$attributes.value"
  }
 }
])

解释:

  1. 匹配(很好地为匹配字段添加索引)
  2. 只过滤所需的属性
  3. 展开将数组转换为对象
  4. 项目仅提供必要的输出

游乐场

备选案文2:(查找/$elemMatch)

代码语言:javascript
复制
db.collection.find({
 _id: 5,
  attributes: {
  "$elemMatch": {
    "defId": 1
   }
 }
},
{
  _id: 0,
  title: 1,
 "attributes": {
    "$elemMatch": {
        "defId": 1
     }
  }
})

解释:

  1. 通过_id和elemMatch匹配元素
  2. 规划必要的要素。(请注意,这里还需要使用elemMatch来筛选确切的匹配属性)(注意,这个版本不会识别是否存在同一个attribute.defId的第二个属性,如果发现需要从应用程序端考虑的话,属性的投影也将是带有单个元素的数组)。

游乐场2

票数 0
EN

Stack Overflow用户

发布于 2022-06-19 19:38:40

通过指定defId

代码语言:javascript
复制
db.collection.aggregate(
    [{
        $project: {
            title: '$title',
            attributes: {
                $filter: {
                    input: '$attributes',
                    as: 'element',
                    cond: { $eq: ['$$element.defId', BinData(3, 'QFDtR03NbkqwuhhG76wS8g==')] }
                }
            }
        }
    }, {
        $project: {
            _id: 0,
            title: '$title',
            value: { $first: '$attributes.value' }
        }
    }])

结果:

代码语言:javascript
复制
{
  "title": "Central station",
  "value": "388"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72679584

复制
相关文章

相似问题

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