在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发送的查询不同?
答案 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"
}
}
}
}
}
}
}
}
};