如何在项目位于数组中的地方返回mongo文档?

coolblue2000

我在mongodb集合中有以下文档,称为“项目”

"_id": {
        "$oid": "5fcfa614d588d46ec44cc375"
    },
    "ProductId": {
        "$binary": {
            "base64": "LredEr/+9UGY3g5oIDWhPw==",
            "subType": "03"
        }
    },
    "ProductName": "ModelProductTest",
    "AccountId": {
        "$binary": {
            "base64": "Gzmr+JvFq0y0YRBOfkj57w==",
            "subType": "03"
        }
    },
    "Skus": [
        {
            "_id": {
                "$oid": "5fcfa614d588d46ec44cc376"
            },
            "ProductSkuId": {
                "$binary": {
                    "base64": "MBLj5bL6C0Cph0fMkpbDZA==",
                    "subType": "03"
                }
            },
            "ProductId": {
                "$binary": {
                    "base64": "LredEr/+9UGY3g5oIDWhPw==",
                    "subType": "03"
                }
            },
            "SkuCode": "kkss",
            "Barcode": "12345",
            "Description": "test",
            "StockQuantity": {
                "$numberInt": "2"
            },
            "Costs": [
                {
                    "_id": {
                        "$oid": "5fcfa614d588d46ec44cc378"
                    },
                    "ProductPriceId": {
                        "$binary": {
                            "base64": "81rqEsKc9k6y2IQQjE1DJg==",
                            "subType": "03"
                        }
                    },
                    "ProductSkuId": {
                        "$binary": {
                            "base64": "MBLj5bL6C0Cph0fMkpbDZA==",
                            "subType": "03"
                        }
                    },
                    "DateValidFrom": {
                        "$date": {
                            "$numberLong": "1607443988489"
                        }
                    },
                    "Cost": "33"
                },
                {
                    "_id": {
                        "$oid": "5fcfa614d588d46ec44cc379"
                    },
                    "ProductPriceId": {
                        "$binary": {
                            "base64": "aqdf9S6yUUCIZEjLY/1pvw==",
                            "subType": "03"
                        }
                    },
                    "ProductSkuId": {
                        "$binary": {
                            "base64": "MBLj5bL6C0Cph0fMkpbDZA==",
                            "subType": "03"
                        }
                    },
                    "DateValidFrom": {
                        "$date": {
                            "$numberLong": "1607443988492"
                        }
                    },
                    "Cost": "39"
                }
            ]
        },
        {
            "_id": {
                "$oid": "5fcfa614d588d46ec44cc377"
            },
            "ProductSkuId": {
                "$binary": {
                    "base64": "XFkTknYw2Uyy2ae/F/yj1A==",
                    "subType": "03"
                }
            },
            "ProductId": {
                "$binary": {
                    "base64": "LredEr/+9UGY3g5oIDWhPw==",
                    "subType": "03"
                }
            },
            "SkuCode": "kksass",
            "Barcode": "12346",
            "Description": "test",
            "StockQuantity": {
                "$numberInt": "6"
            },
            "Costs": [
                {
                    "_id": {
                        "$oid": "5fcfa614d588d46ec44cc37a"
                    },
                    "ProductPriceId": {
                        "$binary": {
                            "base64": "hxWucmMsnkOkRb1j9/EtGA==",
                            "subType": "03"
                        }
                    },
                    "ProductSkuId": {
                        "$binary": {
                            "base64": "XFkTknYw2Uyy2ae/F/yj1A==",
                            "subType": "03"
                        }
                    },
                    "DateValidFrom": {
                        "$date": {
                            "$numberLong": "1607443988492"
                        }
                    },
                    "Cost": "31"
                },
                {
                    "_id": {
                        "$oid": "5fcfa614d588d46ec44cc37b"
                    },
                    "ProductPriceId": {
                        "$binary": {
                            "base64": "ExyZdI6suE2Zs5oRdeiK9w==",
                            "subType": "03"
                        }
                    },
                    "ProductSkuId": {
                        "$binary": {
                            "base64": "XFkTknYw2Uyy2ae/F/yj1A==",
                            "subType": "03"
                        }
                    },
                    "DateValidFrom": {
                        "$date": {
                            "$numberLong": "1607443988492"
                        }
                    },
                    "Cost": "36"
                }
            ]
        }
    ]

我想获取通过条形码搜索时返回的主要对象和特定的sku(不是所有的skus)。如何在C#中使用mongo驱动程序执行此操作?

ΝΝιΓΞΗΛψΚ

您可以使用AsQueryable官方驱动程序界面轻松完成此操作,如下所示:

collection.AsQueryable()
          .Where(i => i.Skus.Any(s => s.Barcode == "22222222")))
          .Select(i => new Item
          {
              Id = i.Id,
              ProductName = i.ProductName,
              Skus = i.Skus.Where(s => s.Description == "second sku")
          })
          .ToListAsync();

您需要对需要返回的主要实体的每个属性进行手动投影,并只需使用Where子句过滤Skus

上面的代码将转换为这样的聚合管道:

[
    {
        "$match": {
            "Skus": {
                "$elemMatch": {
                    "Barcode": "22222222"
                }
            }
        }
    },
    {
        "$project": {
            "_id": "$_id",
            "ProductName": "$ProductName",
            "Skus": {
                "$filter": {
                    "input": "$Skus",
                    "as": "s",
                    "cond": {
                        "$eq": [
                            "$$s.Barcode",
                            "22222222"
                        ]
                    }
                }
            }
        }
    }
]

使用mongodb.entities的测试程序:

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using MongoDB.Entities;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TestApplication
{
public class Item : Entity
{
    public string ProductName { get; set; }
    public IEnumerable<Sku> Skus { get; set; }
}

public class Sku
{
    [ObjectId]
    public string Id { get; set; }
    public string Barcode { get; set; }
}

public static class Program
{
    private static async Task Main()
    {
        await DB.InitAsync("test");

        await new Item
        {
            ProductName = "test product",
            Skus = new[] {
                new Sku { Id = ObjectId.GenerateNewId().ToString(), Barcode = "11111111" },
                new Sku { Id = ObjectId.GenerateNewId().ToString(), Barcode = "22222222" },
                new Sku { Id = ObjectId.GenerateNewId().ToString(), Barcode = "33333333" }
            }
        }.SaveAsync();

        var item = await DB.Queryable<Item>()
                           .Where(i => i.Skus.Any(s => s.Barcode == "22222222"))
                           .Select(i => new Item
                           {
                               ID = i.ID,
                               ProductName = i.ProductName,
                               Skus = i.Skus.Where(s => s.Barcode == "22222222")
                           })
                           .ToListAsync();
    }
}
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在mongo中过滤子数组并返回文档

来自分类Dev

如何在Mongo聚合中合并文档中的数组字段

来自分类Dev

如何在Mongo DB中合并文档数组

来自分类Dev

如何在Mongo DB中合并数组和文档字段

来自分类Dev

如何在mongo中查找不包含数组元素的文档

来自分类Dev

如何在mongo中更新文档子数组中的字段

来自分类Dev

如何让mongo返回字段中的数组?

来自分类Dev

mongo聚合-一个数组中的字段也位于另一个数组中的文档数

来自分类Dev

如何返回数组中不包含长类型的 Mongo db 集合中的所有文档,并更改这些元素的类型

来自分类Dev

如何在所选查询位于同一查询中的地方添加聚合函数

来自分类Dev

如何在MongoDB中返回文档的ObjectId或_id?错误“ $ in需要一个数组”

来自分类Dev

如何在Mongodb中返回与给定条件匹配的子文档数组?

来自分类Dev

如何基于Mongo文档数组中的最大日期获取记录

来自分类Dev

如何在Mongo中返回有限数组,包括提到的项?

来自分类Dev

如何在Mongo聚合中折叠数组?

来自分类Dev

如何获取从函数中的数组返回的项目

来自分类Dev

如何获取从函数中的数组返回的项目

来自分类Dev

如何在mongo中插入带有日期的文档?

来自分类Dev

如何在mongo中删除分片索引的重复文档?

来自分类Dev

如何在mongo中删除分片索引的重复文档?

来自分类Dev

如何在 View 中返回选定的项目?

来自分类Dev

如何在javascript数组中返回传递的当前项目?

来自分类Dev

在mongo的文档中搜索数组中的数据

来自分类Dev

如何在文档中与父元素位于相同坐标的位置放置相对元素?

来自分类Dev

如何在文档中与父元素位于相同坐标的位置放置相对元素?

来自分类Dev

如何在Node中的MongoDB更新中返回完整文档

来自分类Dev

如何在 mongodb 文档中插入项目列表?

来自分类Dev

如何从位于数组中的元素创建数组?

来自分类Dev

如何在symfony2中将mongo文档与子文档映射

Related 相关文章

  1. 1

    如何在mongo中过滤子数组并返回文档

  2. 2

    如何在Mongo聚合中合并文档中的数组字段

  3. 3

    如何在Mongo DB中合并文档数组

  4. 4

    如何在Mongo DB中合并数组和文档字段

  5. 5

    如何在mongo中查找不包含数组元素的文档

  6. 6

    如何在mongo中更新文档子数组中的字段

  7. 7

    如何让mongo返回字段中的数组?

  8. 8

    mongo聚合-一个数组中的字段也位于另一个数组中的文档数

  9. 9

    如何返回数组中不包含长类型的 Mongo db 集合中的所有文档,并更改这些元素的类型

  10. 10

    如何在所选查询位于同一查询中的地方添加聚合函数

  11. 11

    如何在MongoDB中返回文档的ObjectId或_id?错误“ $ in需要一个数组”

  12. 12

    如何在Mongodb中返回与给定条件匹配的子文档数组?

  13. 13

    如何基于Mongo文档数组中的最大日期获取记录

  14. 14

    如何在Mongo中返回有限数组,包括提到的项?

  15. 15

    如何在Mongo聚合中折叠数组?

  16. 16

    如何获取从函数中的数组返回的项目

  17. 17

    如何获取从函数中的数组返回的项目

  18. 18

    如何在mongo中插入带有日期的文档?

  19. 19

    如何在mongo中删除分片索引的重复文档?

  20. 20

    如何在mongo中删除分片索引的重复文档?

  21. 21

    如何在 View 中返回选定的项目?

  22. 22

    如何在javascript数组中返回传递的当前项目?

  23. 23

    在mongo的文档中搜索数组中的数据

  24. 24

    如何在文档中与父元素位于相同坐标的位置放置相对元素?

  25. 25

    如何在文档中与父元素位于相同坐标的位置放置相对元素?

  26. 26

    如何在Node中的MongoDB更新中返回完整文档

  27. 27

    如何在 mongodb 文档中插入项目列表?

  28. 28

    如何从位于数组中的元素创建数组?

  29. 29

    如何在symfony2中将mongo文档与子文档映射

热门标签

归档