2017-10-13 56 views
1

使用Azure CosmosDB Mongo。WHERE子句Azure CosmosDB Mongo子文档

我在文档和子文档中有文本字段。我希望能够搜索。使用Contains可以在父文档属性上正常工作。但似乎并不看孩子。甚至不会返回任何错误。

文件:

{ 
    "TextField1": "this will be found in search", 
    "Comments": [{ 
     "Comment": "amazing post, let's see if this can be foundtoo", 
    }, { 
     "Comment": "thanks", 
    }] 
} 

搜索:

var postFilter = Builders<MyObject>.Filter.Where(p => p.TextField1.ToLowerInvariant().Contains(searchText.ToLowerInvariant())) | 
       Builders<MyObject>.Filter.Where(p => p.Comments.Any(pc => pc.Comment.ToLowerInvariant().Contains(searchText.ToLowerInvariant()))); 

var posts = await Posts.Find(postFilter).ToListAsync(); 

如果我用搜索上面的代码 “发现”。它会返回文档。

如果我将它与搜索“foundtoo”一起使用。它不会返回任何东西。 PS:我已经尝试使用Text,它不被支持,并作为错误返回。

回答

1

Cosmos Mongo Db可能没有实现完整的命令作为本地MongoDB。我试过你提到的代码也得到了和你提到的一样的结果。

使用Contains在父文档属性上工作正常。但似乎并不看孩子。甚至不会返回任何错误。

请尝试使用下面的代码来做到这一点。我在我身边测试它,它工作正常。

var filterResult = collection.Find(Builders<MyObject>.Filter.ElemMatch("Comments", Builders<Mydata>.Filter.Where(p=>p.Comment.ToLowerInvariant().Contains(searchText.ToLowerInvariant())))).ToList(); 

以下是我的详细步骤:

1.创建一个.NET项目,并参考MongoDB.Driver详细请参考packages.config。

2.增加的MYDATA和MyObject来类

public class MyObject 
{ 
    public string TextField1; 
    public Mydata[] Comments; 
    [JsonProperty(PropertyName = "id")] 
    public string Id; 
} 

public class Mydata 
{ 
    public string Comment; 
} 

3.测试用下面的代码。

string connectionString = "connection string"; 
    MongoClientSettings settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString)); 
    settings.SslSettings = new SslSettings { EnabledSslProtocols = SslProtocols.Tls12 }; 
    var mongoClient = new MongoClient(settings); 
    var searchText = "foundtoo"; 
    var db = mongoClient.GetDatabase("dbname"); 
    var collection = db.GetCollection<MyObject>("collectionName"); 
    var mydata1 = new Mydata {Comment = "Thank you"}; 
    var mydata2 = new Mydata {Comment = "amazing post, let's see if this can be foundtoo"}; 
    var list = new List<Mydata> {mydata1, mydata2}; 
    Mydata[] mydatas = {mydata1,mydata2}; 
    collection.InsertOneAsync(new MyObject 
      { 
       Id = Guid.NewGuid().ToString(), 
       TextField1 = "this will be found in search", 
       Comments = mydatas 

      }).Wait(); 
    var filterResult = collection.Find(Builders<MyObject>.Filter.ElemMatch("Comments", Builders<Mydata>.Filter.Where(p=>p.Comment.ToLowerInvariant().Contains(searchText.ToLowerInvariant())))).ToList(); 

enter image description here

packages.config

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="MongoDB.Bson" version="2.4.4" targetFramework="net461" /> 
    <package id="MongoDB.Driver" version="2.4.4" targetFramework="net461" /> 
    <package id="MongoDB.Driver.Core" version="2.4.4" targetFramework="net461" /> 
    <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net461" /> 
    <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net461" /> 
</packages> 
+0

感谢您的详细响应。会试试看。 – Yahya

+0

你是明星! – Yahya