当前位置: 首页 > 面试题库 >

按给定字段搜索嵌套对象的数组

左翰海
2023-03-14
问题内容

我具有Room对象的以下结构。

type Room struct {
Id          bson.ObjectId       `json:"id" bson:"_id,omitempty"`
Title       string              `json:"title" bson:"title"`
Description string              `json:"description" bson:"description,omitempty"`
Type        string              `json:"type" bson:"type,omitempty"`
AdminId     bson.ObjectId       `json:"admin_id" bson:"admin_id"`
CreatedOn   time.Time           `json:"created_on" bson:"created_on"`
Messages    []Message           `json:"messages" bson:"messages,omitempty"`}

其中,消息是具有以下结构的对象的嵌套数组

type Message struct {
Id      bson.ObjectId   `json:"id" bson:"_id,omitempty"`
Text        string          `json:"text" bson:"text"`
Author      Author          `json:"author" bson:"author"`
CreatedOn   time.Time   `json:"createdon" bson:"created_on"`
Reply       []Message   `json:"reply" bson:"reply,omitempty"`}

我想通过房间集合中的消息执行搜索查询。我尝试使用,"$in"但没有帮助我。

而且,我必须通过匹配值来搜索元素。我可以使用bson正则表达式来做到这一点。

&bson.RegEx{Pattern: textToFind, Options: "i"}

总结我需要按Text“房间”文档中嵌套对象中的字段搜索消息。

PS对不起,可能会出现错误,英语不是我的母语。

更新

基本上,我想在给定的房间中找到包含某些子字符串的所有消息。例如,搜索房间(聊天)“ A”中包含“某些文本”子字符串的所有消息


问题答案:

您可以尝试下面的mongo shell聚合管道。

$match在某些房间属性(例如_id)上。

$unwind消息(将messages数组转换为object)在房间里。

$match在输入正则表达式上针对text要过滤的字段messages

$group将消息对象放回到messages数组中。

$project排除_id并仅包括messages用于输出。

db.collection.aggregate(
{$match:{"_id":roomid}}, 
{$unwind:"$messages"}, 
{$match:{"messages.text": { $regex: /textToFind/i } }},
{$group:{_id:null,messages:{$push:"$messages"}}}, 
{$project:{_id:0, messages:1}})

以下是未经测试的mgo当量。

match1 := bson.M{
    "$match": bson.M{
        "_id": roomid,
    },
}

unwind := bson.M{
    "$unwind": "$messages",
}

match2 := bson.M{
    "$match": bson.M{"messages.text": &bson.RegEx{Pattern: textToFind, Options: "i"}},
}

group := bson.M{
    "$group": bson.M{
        "_id": null,
        "messages": bson.M{
            "$push": "$messages",
        },
    },
}

project := bson.M{
    "$project":  bson.M{
        "_id": 0, 
        "messages":1,
    },
}

all := []bson.M{match1, unwind, match2, group, project}
pipe := collection.Pipe(all)

result := []bson.M{}
err := pipe.All(&result)


 类似资料:
  • 问题内容: 我对ES还是相当陌生,并正在将其用于我的新项目。首先,我为客户提供了一个简单的映射,其中包含名字和姓氏以及付款信息对象列表。如果我在SQL中执行此操作,那将类似于客户表和具有1:许多关系的付款信息表。 这是我要执行的操作的一个简单示例:https : //gist.github.com/anonymous/6109593 我希望根据payInfos嵌套数组中的任何匹配项找到任何客户,即

  • 基本问题如下:有没有一种方便的方法可以为嵌套查询的所有字段指定多字段匹配?对于普通查询有效。这在嵌套查询中不起作用,可能是因为嵌套对象没有_all? 下面是更详细的问题: 我有一个名为“Parent”的嵌套文档,如下所示: 这是我用于制作儿童嵌套对象的映射: 这是一个查询,我想使用所有子字段的匹配来选择几个术语查询,以及一个术语查询: 上述查询不起作用,因为我无法为嵌套对象选择多匹配查询中的所有字

  • 我有一个前端ACF表单-ACF_表单()。使用post对象字段。我想通过自定义字段限制查询结果。下面的代码可以正常工作,除了当我尝试在搜索栏中键入时,会出现以下错误:我得到的错误是ajax响应中的PHP错误; 0:“PhpConsole\Handler”- 1:"strpos()" 2:"acf_order_by_search()" 3:“acf_field_post_object- 4:“acf

  • 问题内容: 我正在尝试通过使用搜索文本框来过滤ng-repeat中的嵌套对象。 给定以下对象: 我想做这样的事情: 这确实是行不通的。我尝试了很多事情,但无法使其正常运行。 我不想更改我的对象。 我进行了很多搜索,但没有找到符合我需要的内容。 问题答案: 我终于有了自己的问题的答案。 我只需要创建自己的过滤器,并使用正则表达式检查对象内部的属性是否具有所需的值即可: 并以这种方式在HTML中应用它

  • 问题内容: 我有一个这样的映射: 我需要按对象的大小进行搜索。我已经试过了: 这是行不通的。给出错误 嵌套:ElasticSearchIllegalArgumentException [在类型为[post]的映射中未找到[提及]的字段]; 我还尝试过用替换脚本部分。这也是错误的 嵌套:ArrayIndexOutOfBoundsException [10]; 如何查询对象大小为2的记录? 问题答案:

  • 我有一个弹性搜索索引集合,如下所示, 现在我需要通过将与其值匹配来搜索文档。(是一些字段,其值存储在中)例如。对于字段,如果它是,则应与上述文档匹配。 我尝试将其映射为嵌套对象,但我无法编写查询来搜索与其相应值匹配的2个或更多的键id。