MongoDB .NET Driver 2.4匹配阶段

时间:2016-12-05 10:47:29

标签: .net mongodb driver

在Robomongo中,以下查询有效并返回客户名称或国家/地区包含“Acushnet”的所有文档。

db.getCollection('plants').aggregate([
 $match: { 
     $or  : 
     [
        { 
            'customerName.Name.value' : /Acushnet/
        },
        { 
            'country.CountryName' : /Acushnet/
        }
     ]
 }
])

在我的.NET示例中,我添加完全相同的匹配阶段:

        var matchStage = new BsonDocument
        {
            {
                "$match", new BsonDocument
                {
                    {
                        "$or", new BsonArray
                        {
                                new BsonDocument
                                {
                                    {
                                    "customerName.Name.value", "/" + term + "/"
                                    }
                                },
                                new BsonDocument
                                {
                                    {
                                        "country.countryName", "/" + term + "/"
                                    }
                                }
                        }
                    }
                }
            }
        };
        pipe.AppendStage<BsonDocument>(matchStage);

Term是我的搜索字词('acushnet')的占位符。对我来说,两个例子是相同的,但第二个返回所有文件。第一个只返回四个文件 - 包含Acushnet的文件。

为什么.NET驱动程序与我与Robomongo发送的查询不同?

1 个答案:

答案 0 :(得分:0)

好吧我明白了。 Robomongo通过点符号自动搜索数组,因为customer.Name是一个数组,这是有效的。 .net驱动程序不允许这样做,所以我需要使用$ elemMatch:

        var matchStage = new BsonDocument
        {
            {
                "$or" , new BsonArray 
                    {
                        new BsonDocument
                        {
                            {
                                        "customerName", new BsonDocument
                                          {
                                                {
                                                    "$elemMatch", new BsonDocument
                                                    {
                                                        {
                                                            "Name", new BsonDocument
                                                            {
                                                                {
                                                                    "$elemMatch", new BsonDocument {
                                                                        {
                                                                            "value", "Sunprene"
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                         }
                            }
                        },
                        new BsonDocument
                        {
                            {
                                    "country" , new BsonDocument
                                    {
                                        {
                                            "$elemMatch", new BsonDocument
                                            {
                                                {
                                                    "CountryName", "United States"
                                                }
                                            }
                                        }
                                    }
                            }
                        }                                            
                    }                     
            }
        };