【问题标题】:How to perform search documents by items in subcollection如何按子集合中的项目执行搜索文档
【发布时间】:2015-07-09 15:11:12
【问题描述】:

我有这样的文档结构:

{
    "Name" : "Hello world",
    "Parameters" : [ 
        {
            "Key" : 104,
            "Value" : 8
        }, 
        {
            "Key" : 112,
            "Value" : 20
        }, 
        {
            "Key" : 176,
            "Value" : 2
        }, 
        {
            "Key" : 179,
            "Value" : 1
        }, 
        {
            "Key" : 180,
            "Value" : 3
        }, 
        {
            "Key" : 177,
            "Value" : 1
        }, 
        {
            "Key" : 302,
            "Value" : 1
        }, 
        {
            "Key" : 303,
            "Value" : 0
        }, 
        {
            "Key" : 178,
            "Value" : 3
        }, 
        {
            "Key" : 181,
            "Value" : 2015
        }
    ]  
}

我需要选择参数集合中的任何参数应用于下一个条件的所有对象:

Expression<Func<SuperObject, bool>> newPred = x => x.Parameters.Any(
    p => p.Key == id 
    && p.Value >= min 
    && p.Value <= max
)

我尝试过这样做:

db.SuperObjects.find({ 
    Parameters: { 
        $elemMatch: { 
            Key: 104, 
            $and: [
                {Value: { $gte: 8 }}, 
                {Value: { $lte: 10 }}
            ] 
        } 
    } 
})

它在 mongodb 中工作。但是如何用c#编写这样的代码呢?

我试过了

filter = filter & builder.ElemMatch("Parameters", builder.Eq("Key", id) & builder.Gte("Value", min) & builder.Lte("Value", max));

它抛出无效的转换异常,因为试图将参数对象转换为我的 SuperObject...

【问题讨论】:

    标签: c# mongodb mongodb-query bson


    【解决方案1】:

    据我所知,此查询不会为您提供满足您条件的参数,而是整个文档本身。那是故意的吗?要仅选择一组子文档,您必须使用 group。

    话虽如此,您可以像这样直接根据您的 Mongo 查询创建过滤器

    BsonDocument filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize&lt;BsonDocument&gt;("{ Parameters: { $elemMatch: { Key: 104, $and: [{Value: { $gte: 8 }}, {Value: { $lte: 10 }}] } } })")

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      相关资源
      最近更新 更多