我有一个具有以下架构的集合-

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 });

以下是该Collection 可能拥有的一些示例文档-

{
  _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"
    }

我正在try 以下查询,但不起作用-

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

推荐答案

如果我理解正确的话,你可以这样用你自己的Collection 来使用$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

Mongodb相关问答推荐

MongoDB:从集合页面数据中提取不同的值

MongoDB:如何通过增量向量递增整数向量

用Spring Boot查询MongoDB中的对象数组

Mongo Aggregate管道-另一个集合中的多个查找

从 Amazon S3(Next.js、Mongodb、Mongoose)删除图像

尽管前一阶段输出文档,$group stage 仍返回零文档

定期自动轮换 MongoDb 集合

聚合 $accumulator + $project

Mongodb 仅在值唯一时插入,否则更新 - 在 node.js 中

在mongo聚合中将ObjectID转换为字符串

MongoDB 聚合 $divide 计算字段

mongodump 是否锁定数据库?

在mongodb中实现分页

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

Spring Mongo 条件查询两次相同的字段

MongoDB - 文件大小巨大且不断增长

majority和 linearizable的区别

MongoDb 连接被拒绝

mongoose — 判断 ObjectId 是否存在于数组中

有没有办法防止 MongoDB 向集合名称添加复数形式?