【问题标题】:Exact Match Array in Mongo QueryMongo 查询中的精确匹配数组
【发布时间】:2015-03-28 09:50:08
【问题描述】:

使用 Linq 语法,如何精确匹配文档中的数组?

这个查询很好用,除了它匹配有其他孩子不是 3 或 4 岁的文档。

    var query = collection.AsQueryable<Parent>().Where(p => p.Children.Any(c => c.Age == 3) && p.Children.Any(c => c.Age == 4));

例如,它不应该返回这个文档:

{
    "_id" : ObjectId("5514c620923a9b55e22f0adf"),
    "Name" : "Bob",
    "Children" : [ 
        {
            "Name" : "Kid1",
            "Age" : 5
        }, 
        {
            "Name" : "Kid2",
            "Age" : 4
        }, 
        {
            "Name" : "Kid3",
            "Age" : 3
        }
    ]
}

并且应该匹配这个文件:

{
    "_id" : ObjectId("5514c620923a9b55e22f0adf"),
    "Name" : "Bob",
    "Children" : [ 
        {
            "Name" : "Kid2",
            "Age" : 4
        }, 
        {
            "Name" : "Kid3",
            "Age" : 3
        }
    ]
}

这基本上是这个问题的副本,但使用 linq c# 语法。

Matching an array field which contains any combination of the provided array in MongoDB

如果您还可以使用 c# QueryBuilder 而不是 linq 来显示它,则可以加分。

【问题讨论】:

  • 怎么样:collection.AsQueryable&lt;Parent&gt;().Where(p =&gt; p.Children.All(c =&gt; new[]{3,4}.Contains(c.Age));
  • 如果文档包含[3,4,5]$all: [3,4] 也会匹配

标签: c# linq mongodb


【解决方案1】:

您可以创建另一个数组,其中包含不同的年龄列表。即:

{
  ages: [3,4],
  children: [
    { name: "A", age: 3 },
    { name: "A", age: 4 },
    { name: "A", age: 3 }
  ]
}

现在您可以使用$all 查询:http://docs.mongodb.org/manual/reference/operator/query/all/

结合$size查询:http://docs.mongodb.org/manual/reference/operator/query/size/

{ ages: { $all: [3,4], $size: 2 } }

【讨论】:

  • 我认为这很接近,您如何在Linq中使用$size和在c#中使用QueryBuilder?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 2016-03-07
相关资源
最近更新 更多