当前位置: 首页 > 知识库问答 >
问题:

WHERE条款SDB Mongo子文件

任繁
2023-03-14

使用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();

如果我将上述代码与搜索“find”一起使用。它将返回文档。

如果我使用它与搜索“发现”。它不会返回任何东西。

PS:我尝试过使用文本,但它不受支持,并且作为错误返回。

共有1个答案

景翰音
2023-03-14

Cosmos Mongo Db可能没有将整个命令作为本机MongoDB实现。我尝试了你提到的代码,也得到了与你提到的相同的结果。

使用包含可以很好地处理父文档属性。但似乎根本不看孩子。甚至不返回任何错误。

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

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

以下是我的详细步骤:

1.创建一个。net项目和参考MongoDB。驱动程序更多详细信息请参阅软件包。配置。

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

包装。配置

<?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>
 类似资料:
  • 问题内容: 我有一个执行查询的SQL Server 2005存储过程。该存储过程采用三个参数。参数如下: @StateID为int, @ CountyID为int, @ CityID为int 这些参数用于查询客户列表。如果参数值不为null,我基本上想做一个“ AND”。但是,我目前无法执行if- else。如果参数值不为null,如何添加这些子句。换一种说法: 问题答案: 加上一些OR语句: 对

  • 问题内容: 我目前有一个查询,它将根据我想使用的任何条件从数据库中提取一堆信息。 如果参数=’‘,我希望能够删除注释部分并仅显示所有行 例如,如果我使用它,它将按该参数搜索,如果我使用它,将按该参数搜索。 我已经尝试使用以下方法和其他一些尝试,但是进展并不很快。 问题答案: 您可能需要考虑构建查询。

  • 问题内容: 在此找到了两个类似的问题,但无法弄清楚如何应用于我的方案。 我的函数有一个名为 @IncludeBelow 的参数。值是0或1(BIT)。 我有这个查询: 如果@IncludeBelow为0,我需要查询如下: 如果@IncludeBelow为1,则最后一行需要排除。(即不应用过滤器)。 我猜想它必须是一条语句,但无法弄清楚语法。 这是我尝试过的: 显然,这是不正确的。 正确的语法是什么

  • 我想对group by子句和where子句使用hibernate标准。 就像我有一个sql这样: 在使用标准组BY时,我如何在hibernate投影中传递截断的日期。

  • 问题内容: 例如,我对我的书籍清单有动态过滤器,可以在其中设置特定的颜色,作者和类别。该过滤器可以一次设置多种颜色,也可以设置多种类别。 如何有条件地添加“ where”? 问题答案: 如您在API文档中所见,collection()方法返回一个CollectionReference。CollectionReference扩展了Query。Query.where()和Query.orderBy()

  • 主要内容:所需步骤,示例代码在本教程将演示如何在JDBC应用程序中,从数据库表中查询数据记录, 在查询选择记录时使用WHERE子句添加其他条件。 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式的数据库表中查询数据记录。 要执行以下示例,需要用实际用户名和密码替换这里用户名()和密码()。 MySQL或数据库已启动并运行。 所需步骤 使用JDBC应用程序查询表中数据记录需要以下步骤: 导入