鉴于此,三个MongoDB对象

{
    "_id" : 1,
    "array" : [ "a", "b", "c" ]
}
{
    "_id" : 2,
    "array" : [ "a", "b", "c" ]
}
{
    "_id" : 3,
    "array" : [ "x", "a", "b", "c" ]
}
{
    "_id" : 4,
    "array" : [ "x", "b", "c", "a" ]
}

我想用两种不同的方式进行搜索.

首先,我想查找数组以["a","b"]开头所有对象,它们应该是对象1,2,而不是3和4.

我想搜索数组中包含["a","b"]的所有对象,其顺序应该是1,2,3,而不是4.

您知道如何按该顺序和/或从数组的开头开始搜索数组的子集吗?

推荐答案

要判断有序子集,可以try 执行以下操作:

db.collection.aggregate([
  {
    "$match": {
      $expr: {
        "$eq": [
          {
            "$filter": {
              "input": "$array",
              "as": "item",
              "cond": {
                "$in": [
                  "$$item",
                  [
                    "a",
                    "b"
                  ]
                ]
              }
            }
          },
          [
            "a",
            "b"
          ]
        ]
      }
    }
  }
])

在这个查询中,我们首先过滤数组,使其只包含子集中存在的元素,然后比较数组,看它们是否有序.

Playground link.

要在开始时判断有序数组,请对数组进行切片,然后进行比较,如下所示:

db.collection.aggregate([
  {
    "$match": {
      $expr: {
        "$eq": [
          {
            "$slice": [
              "$array",
              2
            ]
          },
          [
            "a",
            "b"
          ]
        ]
      }
    }
  }
])

Playground link

Mongodb相关问答推荐

从两个相连的文件中获取电话和邮箱的渠道是什么?

无法在Ubuntu 22.04上安装MongoDB 7.0

无法通过管理邮箱/密码身份验证注册/登录新用户帐户(类型错误:加载失败)

如何在 mongodb 中将一个方面的结果合并到一个有条件的列表中?

在golang中的mongodb中的集合列表中打印集合

在推入 mongodb 时自动填充 golang struct 中的 created_at 和 updated_at

MongoDB 列表 - 获取每第 N 个元素

MongoDB - 如果新值更大,则更新字段

聚合/元素子文档作为 mongo 中的顶级文档

Java MongoDB FindOne 获取最后插入的记录

oplog 在独立 mongod 上启用,不适用于副本集

Select 匹配mongodb中两个字段的concat值的记录

在 GridFS、express、mongoDB、node.js 中存储来自 POST 请求的数据流

遍历所有 Mongo 数据库

如何在 MongoDB 的 $match 中使用聚合运算符(例如 $year 或 $dayOfMonth)?

如何使用 MongoDB C# 驱动程序有条件地组合过滤器?

mongoose:按字母顺序排序

从 mongo 结果中删除 _id

MongoDB 连接字符串到副本集

带有 either or查询的mongoose findOne