我想查一下,100是动态的:

{
    $merge: {
        _id: ObjectId('61e56339b528bf009feca149')
    }
},
{
    $lookup: {
        from: 'computer',
        localField: '_id',
        foreignField: 'configs.?.refId',
        as: 'computers'
    }
}

我知道100总是以configs开头,以refId结尾,但两者之间的字符串是动态的.

以下是文档外观的示例:

'_id': ObjectId('6319bd1540b41d1a35717a16'),
'name': 'MyComputer',
'configs': {
    'ybe': {
        'refId': ObjectId('61e56339b528bf009feca149')
        'name': 'Ybe Config'
    },
    'test': {
        'refId': ObjectId('61f3d7ec47805d1443f14540')
        'name': 'TestConfig'
    },
    ...
}

正如您所看到的,configs属性包含具有不同名称(‘ybe’、‘test’等)的不同对象.我想根据所有这些对象内部的refID进行查找.

我怎样才能做到这一点?

推荐答案

使用动态值作为字段名被认为是反模式的,并且会给查询带来不必要的复杂性.但是,您可以通过将对象转换为k-v对数组并在子流水线中执行$match来实现$objectToArray的行为.

db.coll.aggregate([
  {
    "$lookup": {
      "from": "computer",
      "let": {
        id: "$_id"
      },
      "pipeline": [
        {
          $set: {
            configs: {
              "$objectToArray": "$configs"
            }
          }
        },
        {
          "$unwind": "$configs"
        },
        {
          $match: {
            $expr: {
              $eq: [
                "$$id",
                "$configs.v.refId"
              ]
            }
          }
        }
      ],
      "as": "computers"
    }
  }
])

MongoPlayground

Mongodb相关问答推荐

映射数组值并查找每个匹配的集合

如何使用ID数组对一个集合中的金额求和并更新另一个集合中的字段?

数组字段包含其他字段的数组值

如何在Mongodb Mongoose Nodejs中提取不等于一组值的字段

Mongo聚合的具体格式

如何在查找 foreignField 中使用通配符?

在延迟函数中重用 context.WithTimeout

Mongodb,在一个查询中用正则表达式更新部分字符串

MongoDB:通过嵌套数组中的最后一个元素值获取文档

如何将以下聚合查询转换为 bson 并在 golang 中执行

mongodb 中的 --bindip 配置选项有什么作用?

如何在 MongoDB 集合中查找与给定条件匹配的文档和单个子文档

如何使用sailsjs v0.10连接mongodb?

如何在array.NET驱动程序中的元素属性上创建MongoDB MultiKey索引

如何使用 java 驱动程序更新 mongo db 中的文档字段?

无法连接到远程 mongodb 服务器

MongoDB 数据库,相当于 SELECT column1, column2 FROM tbl

Mongoose - 获取 _id 列表而不是具有 _id 的对象数组

多次使用位置 `$` 运算符来更新嵌套数组

MongoDB Compass 中 JSON 输入意外结束