2017-10-13 6 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(); 

次は私の詳細の手順です:packages.configをご参照ください

1.Create .NETプロジェクトとMongoDB.Driver詳細を参照します。

2.Addニック・マイデータとMyObjectにクラス

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

public class Mydata 
{ 
    public string Comment; 
} 

次のコードで3.Test。詳細な応答のための

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