我有一个集合有以下模式-
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" }
}]
1条答案
按热度按时间laik7k3q1#
如果我理解正确的话,你可以用这种方式将
$lookup
与你自己的集合一起使用:在这个查询中,你可以像你做的那样
$match
,然后,你可以使用collection
和匹配itemId
来匹配你的数据$lookup
(像SQLJOIN
)。所以就像说“将匹配的
itemId
与所有其他itemId
连接起来”。我觉得这是你想要的。另外两个步骤是将结果作为根输出。
示例here