具有嵌套数组的示例数据:

[
  {
    "rows": [["123", "234", "345"], ["345", "456", "567"]]
  },
  {
    "rows": [["111", "222", "333"], ["444", "555", "345"]]
  },
]

给定一个特定值(例如345),我希望将找到的值及其第一个数组索引(例如row_i)和第二个数组索引(例如col_i)聚合到结果中:

[
  {"value": "345", "row_i": 0, "col_i": 2},
  {"value": "345", "row_i": 1, "col_i": 0},
  {"value": "345", "row_i": 1, "col_i": 2},
]

我知道如何使用$elemMatch(Example 1)聚合整个文档,但这不包括行/列索引.

我try 使用$unwind,但只能使用嵌套对象,而不能使用数组(Example 2).我有一个限制,那就是我根本不能更改数据 struct .

推荐答案

简单地使用$unwindincludeArrayIndex两次来创建row_icol_i字段.

db.collection.aggregate([
  {
    "$unwind": {
      path: "$rows",
      includeArrayIndex: "row_i"
    }
  },
  {
    "$unwind": {
      path: "$rows",
      includeArrayIndex: "col_i"
    }
  },
  {
    $match: {
      "rows": "345"
    }
  },
  {
    "$project": {
      "value": "$rows",
      "row_i": 1,
      "col_i": 1
    }
  }
])

Mongo Playground

Mongodb相关问答推荐

筛选出嵌套数组中的记录Mongo DB聚合

Mongodb聚合查找异常值

在数据中只有月份和年份的 mongodb 中字符串的日期时间

mongoose中的 required是什么意思?

更新 MongoDB 中嵌套实体数组中的属性

哪种 NoSQL DB 最适合 OLTP 金融系统?

Meteor 方法与deny/allow 规则

mongo _id 字段重复键错误

更新 mongodb 文档中的特定字段

在 mongoDB 中存储 java 8 LocalDate

在 Mongoose 中清理用户输入

使用 MongoDB 进行分页

Mongoose 与 mongodb 如何返回刚刚保存的对象?

Node.js 和 Passport 对象没有方法 validPassword

使用 nodejs/mongoose 部分更新子文档

MongoDB聚合排序不起作用

MongoError: The dollar ($) prefixed field '$push' in '$push' is not valid for storage

120 个 mongodb 集合与单个集合 - 哪个更有效?

在 mongoose 中使用 UUID 进行 ObjectID 引用

是否可以在 Mongodb 中的两个数据库之间进行 $lookup 聚合?