仅从mongodb返回数组中的命中

平子

所以我有一个带有一些嵌套文档的mongodb集合。示例文件如下所示:

{
  "_id": "5afa9472e937b7254a306ff6",
  "import_date": "2018-05-15T08:04:02.813Z",
  "some_more_things": "foo",
  "meta": {
    "participants": [{ "name": "Ben" }, { "name": "Mary" }],
    "messages": [
      {
        "tokens": [
          { "token": "What" },
          { "token": "do" },
          { "token": "you" },
          { "token": "do" },
          { "token": "today" }
        ],
        "time": "2018-05-09T08:38:19.000Z"
      },
      {
        "tokens": [
          { "token": "Just" },
          { "token": "lying" },
          { "token": "around" }
        ],
        "time": "2018-05-09T08:40:08.000Z"
      },
      {
        "tokens": [
          { "token": "What" },
          { "token": "about" },
          { "token": "you" }
        ],
        "time": "2018-05-09T08:40:11.000Z"
      }
    ]
  }
}

我现在正在寻找一种有效的方法来搜索包含特定令牌的消息。我正在执行以下查询:

db.conversations.find({'meta.messages.tokens.token': /^What$/i})
   .projection({'import_date': 1, 'meta.messages': 1})
   .sort({_id:-1})
   .limit(100)

这样我找到了我想要的文档,但是得到了完整的messages数组。有没有办法我只能获取messages与正则表达式匹配数组结果应如下所示(因此仅示例文档的第一项和最后一项)。

{
  "_id": "5afa9472e937b7254a306ff6",
  "import_date": "2018-05-15T08:04:02.813Z",
  "meta": {
    "participants": [{ "name": "Ben" }, { "name": "Mary" }],
    "messages": [
      {
        "tokens": [
          { "token": "What" },
          { "token": "do" },
          { "token": "you" },
          { "token": "do" },
          { "token": "today" }
        ],
        "time": "2018-05-09T08:38:19.000Z"
      },
      {
        "tokens": [
          { "token": "What" },
          { "token": "about" },
          { "token": "you" }
        ],
        "time": "2018-05-09T08:40:11.000Z"
      }
    ]
  }
}
米克尔

您可以使用$ indexOfBytes来检查What每个字符串中是否存在。您还需要$地图$过滤器$ anyElementTrue搭建嵌套数组的过滤条件:

db.collection.aggregate([
    {
        $addFields: {
            "meta.messages": {
                $filter: {
                    input: "$meta.messages",
                    as: "m",
                    cond: {
                        $anyElementTrue: {
                            $map: {
                                input: "$$m.tokens",
                                in: { $gte: [ { $indexOfBytes: [ "$$this.token", "What" ] }, 0 ] }
                            }
                        }
                    }
                }
            }
        }
    }
])

蒙哥运动场

如果您需要正则表达式,可以查看其中引入的$ regexMatch并将4.2其替换为$indexOfBytes

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何仅从mongoDB数组返回匹配的元素

来自分类Dev

如何仅从MongoDB数组返回对象的字符串值

来自分类Dev

在mongodb中返回数组

来自分类Dev

mongodb如何仅从查找查询中返回值列表

来自分类Dev

mongodb如何仅从查找查询中返回值列表

来自分类Dev

仅从Javascript中的对象数组返回某些属性

来自分类Dev

MongoDB 请求:仅从嵌入数组中的嵌入文档中过滤特定字段

来自分类Dev

mongodb中数组的流星返回长度

来自分类Dev

Mongodb仅返回数组中匹配的元素

来自分类Dev

如何仅在mongodb中返回数组的长度?

来自分类Dev

在MongoDB中返回数组项的子集

来自分类Dev

仅从所选表达式中返回 "

来自分类Dev

PHP仅从数组中获取值

来自分类Dev

仅从嵌套数组中获取值

来自分类Dev

PHP仅从数组中获取值

来自分类Dev

JavaScript - 仅从数组中获取负数

来自分类Dev

仅从数组中获取值(无键)

来自分类Dev

MongoDB返回空数组

来自分类Dev

如何仅从数组返回一次重复项?

来自分类Dev

Mongodb:仅从此对象获取帖子评论数组

来自分类Dev

Azure 搜索在邻近搜索中返回额外的命中亮点

来自分类Dev

AS3检查是否未命中数组中的任何对象

来自分类Dev

在Elasticsearch中搜索数组时获取对象命中

来自分类Dev

MongoDb仅返回数组中的一个元素

来自分类Dev

在mongodb中返回包含满足条件的数组的完整文档

来自分类Dev

如何在MongoDB中返回数组匹配条件的元素

来自分类Dev

从mongoDB中的数组返回随机键和单词

来自分类Dev

mongoDB(在nodeJS中)聚合pipleine返回空数组

来自分类Dev

如何将返回的值推入数组mongodb中?