gpt4 book ai didi

c# - WHERE 子句 Azure CosmosDB Mongo 子文档

转载 作者:行者123 更新时间:2023-12-03 03:03:34 24 4
gpt4 key购买 nike

使用 Azure CosmosDB Mongo。

我的文档和子文档中有文本字段。我希望能够搜索到。

使用 Contains 在父文档属性上效果很好。但似乎根本不看 child 。甚至不返回任何错误。

文档:

 {
"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();

如果我使用上面的代码搜索“found”。它将返回文档。

如果我将它与搜索“foundtoo”一起使用。它不会返回任何内容。

PS:我尝试使用 Text,但它不受支持并返回错误。

最佳答案

Cosmos Mongo Db 可能没有像原生 MongoDB 那样实现完整的命令。我尝试了您提到的代码也得到了与您提到的相同的结果。

Using Contains works fine on the parent document properties. But doesn't seem to look at children at all. And doesn't even return any error.

请尝试使用以下代码来执行此操作。我在我这边测试了一下,工作正常。

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>

关于c# - WHERE 子句 Azure CosmosDB Mongo 子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46725997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com