2017-09-27 110 views
0

比方说,我已经嚣文件复杂查询过滤

"Id" : "lot1", 
"Fruits" : [ 
     [{ "Id": "fruit1", "Name": "apple"}, { "Id": "fruit2", "Name": "carrot"}] 
     [{ "Id": "fruit3", "Name": "banana"}] 
    ] 

问:我如何可以查询水果的名称列表的水果阵列?

我已经试过这样:

var fruitNames = new List<string>(){ "apple", "banana" }; 
var builder = Builders<Lot>.Filter; 
var filter = builder.AnyIn(l => l.Fruits.Select(f => f.Name), fruitNames); //TAKE 1 
var filter = builder.Where(l => l.Fruits.Select(f => f.Name).Any(f => fruitNames.Contains(f)));//TAKE 2 
var filter = builder.AnyIn("Fruits.Name", fruitNames);//TAKE 3 
var results = mongoContext.Lots.Find(filter).ToList(); 

我没有成功这3种方法都试过了。

回答

1

你可以试试吗?这是一个小技巧,但我敢肯定它会工作:

var filter= Builders<Lot>.Filter.ElemMatch(y => y.fruits, x => fruitNames.Contains(x.name)); 
+0

如果当前的“水果”阵列将是一个奇异的物体,会怎么查询修改? var filter = Builder .In(l => l.Fruits.Name,fruitNames); //不起作用 – Misi

+0

你整理了一下还是需要帮助@Misi? – BOR4