mongoose MongoDB -从先前匹配的文档中聚合匹配字段

cfh9epnr  于 2023-06-23  发布在  Go
关注(0)|答案(1)|浏览(154)

我有一个集合有以下模式-

const ContentSchema = new Schema({
    label: {
        type: String
    },
    itemId: {
        type: Schema.ObjectId,
        refPath: 'onModel'
    },
    formId: {
        type: Schema.ObjectId,
        refPath: 'onModel'
    },
    value: {
        type: Schema.Types.Mixed,
        index: "text"
    },
}, { timestamps: true, versionKey: false });

以下是该集合可能包含的一些示例文档-

{
  _id: ObjectId('647b1538c29a553ad6e8f316'),
  label: "Name",
  itemId: ObjectId('647b1538c29a553ad6e8f313'),
  formId: ObjectId('647b1538c29a553ad6e8f913'),
  value: "ABC"
},
{
  _id: ObjectId('647b1538c29a553ad6e8f416'),
  label: "Email",
  itemId: ObjectId('647b1538c29a553ad6e8f313'),
  formId: ObjectId('647b1538c29a553ad6e8f913'),
  value: "def@mail.com"
},
{
  _id: ObjectId('647b1538c29a553ad6e8f516'),
  label: "Name",
  itemId: ObjectId('647b1538c29a553ad6e8f320'),
  formId: ObjectId('647b1538c29a553ad6e8f913'),
  value: "MNO"
},
{
  _id: ObjectId('647b1538c29a553ad6e8f616'),
  label: "Email",
  itemId: ObjectId('647b1538c29a553ad6e8f320'),
  formId: ObjectId('647b1538c29a553ad6e8f913'),
  value: "xyz@mail.com"
}

现在,我需要执行一个查询,以使用formId-ObjectId('647b1538c29a553ad6e8f913')从集合中搜索“ABC”。
下面是代码来实现这一点-

return await ContentModel.aggregate([
{
    $match: {
        $text: { $search: text },
        formId: new mongoose.Types.ObjectId(formId)
    }
}]

上面的代码绝对工作正常,并返回文档-

{
    _id: ObjectId('647b1538c29a553ad6e8f316'),
    label: "Name",
    itemId: ObjectId('647b1538c29a553ad6e8f313'),
    formId: ObjectId('647b1538c29a553ad6e8f913'),
    value: "ABC"
}

但我需要在同一个聚合中有更多的记录。现在我需要从itemId为-ObjectId('647b1538c29a553ad6e8f313')的文档中找出其他文档。
因此聚合现在应该返回2个文档-

{
      _id: ObjectId('647b1538c29a553ad6e8f316'),
      label: "Name",
      itemId: ObjectId('647b1538c29a553ad6e8f313'),
      formId: ObjectId('647b1538c29a553ad6e8f913'),
      value: "ABC"
    },
    {
      _id: ObjectId('647b1538c29a553ad6e8f416'),
      label: "Email",
      itemId: ObjectId('647b1538c29a553ad6e8f313'),
      formId: ObjectId('647b1538c29a553ad6e8f913'),
      value: "def@mail.com"
    }

我正在尝试以下查询,但不工作-

return await ContentModel.aggregate([
{
    $match: {
        $text: { $search: text },
        formId: new mongoose.Types.ObjectId(formId)
    }
},
{
    $match: { itemId: "$itemId" }
}]
laik7k3q

laik7k3q1#

如果我理解正确的话,你可以用这种方式将$lookup与你自己的集合一起使用:
在这个查询中,你可以像你做的那样$match,然后,你可以使用collection和匹配itemId来匹配你的数据$lookup(像SQL JOIN)。
所以就像说“将匹配的itemId与所有其他itemId连接起来”。我觉得这是你想要的。

db.collection.aggregate([
  {
    "$match": { /* your match*/ }
  },
  {
    "$lookup": {
      "from": "collection",
      "localField": "itemId",
      "foreignField": "itemId",
      "as": "results"
    }
  },
  {
    "$unwind": "$results"
  },
  {
    "$replaceRoot": {
      "newRoot": "$results"
    }
  }
])

另外两个步骤是将结果作为根输出。
示例here

相关问题