我有兩個集合:collA并且collB我正在進行以下查找:
db.collA.aggregate([
{
$lookup: {from: 'collB', localField: '_id', foreignField: 'key', as: 'bs'}
}])
如果我們停在這里然后bs是一個物件陣列
每個“b”物件都有一個欄位name。
我想只過濾bs滿足條件之一的記錄:b.name == query_name。
- 我認為
$elemMatch不可能 - 我也認為我可以
$unwind,$group但感覺像是開銷。
有沒有一種簡單的方法來過濾這個條件?
樣本資料:
科爾A:
[
{"_id": "1", "a": 1, "b": 1},
{"_id": "2", "a": 2, "b": 2}
]
科爾B:
[
{"key": "1", "name": "Ron"},
{"key": "1", "name": "Bob"},
{"key": "1", "name": "Dana"},
{"key": "2", "name": "John"},
{"key": "2", "name": "Ron"}
]
因此,如果查詢是Ron我希望從 collA 獲取兩個檔案。如果查詢是Bob我希望只得到檔案_id == 1
uj5u.com熱心網友回復:
解決方案 1
$filter在$projectstage 中使用從陣列 ( bs) 中過濾檔案。
db.collA.aggregate([
{
$lookup: {
from: "collB",
localField: "_id",
foreignField: "refId",
as: "bs"
}
},
{
$project: {
_id: 1,
bs: {
"$filter": {
"input": "$bs",
"cond": {
$eq: [
"$$this.name",
/* Filter value */
]
}
}
}
}
}
])
Mongo Playground 上的示例解決方案 1
解決方案 2
$lookup與管道一起使用。
db.collA.aggregate([
{
$lookup: {
from: "collB",
let: {
id: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$$id",
"$refId"
]
},
{
$eq: [
"$name",
/* Filter value */
]
}
]
}
}
}
],
as: "bs"
}
}
])
Mongo Playground 上的示例解決方案 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/406686.html
標籤:
