MongoDb模型看起来是这样的。
{
"_id": {
"$oid": "5ee269c949c9d58970528d1e"
},
"parent": [
{
"_id": {
"$oid": "5ee269c949c9d58970528d1d"
},
"uType": "parent",
"fName": "p1",
"lName": "p1",
"num": "123"
}
],
"child": [
{
"_id": {
"$oid": "5ee269c949c9d58970528d1c"
},
"uType": "child",
"fName": "c1",
"lName": "c1",
"num": "8963",
"email": "[email protected]",
"gender": "male"
}
]
}
我有一个传入的对象,它的样子是这样的。
{
"uType":"child",
"fName": "c2",
"lName": "c2",
"num": "98733",
"email": "[email protected]",
"invite": {
"uType": "parent",
"fName": "p1",
"lName": "p1",
"num": "123"
}
}
我必须对传入的对象进行过滤,从而得到如下的响应--这意味着对于传入的对象,有一个匹配的父对象,但没有一个匹配的子对象。
我试过使用$or,并提供了多个条件,但每次都在子数组中得到一条记录。我也试过使用aggregation,但找不到可能的解决方案。谁能告诉我什么是最好的方法?
{
"_id": {
"$oid": "5ee269c949c9d58970528d1e"
},
"parent": [
{
"isActive": false,
"_id": {
"$oid": "5ee269c949c9d58970528d1d"
},
"uType": "parent",
"fName": "p1",
"lName": "p1",
"num": "123"
}
],
"child": [ ]
}
更新: 尝试使用投影,但仍然没有结果 ----------------。
Model.aggregate([
{
$project: {
child: {
$filter: {
input: "$child",
as: "ch",
cond: { $eq: ["$ch.num", this.num] }
}
}
}
}
])
事实上,你是 所以 接近解决方案,如果你使用 "$$ch.num"
而不是 "$ch.num"
它应该可以工作。
const match = {
"uType":"child",
"fName": "c2",
"lName": "c2",
"num": "98733",
"email": "[email protected]",
"invite": {
"uType": "parent",
"fName": "p1",
"lName": "p1",
"num": "123"
}
}
Model.aggregate([
{
$match: {
$or: [
{
"parent.num": match.invite.num
},
{
"child.num": match.num
}
]
}
},
{
$project: {
parent: {
$filter: {
input: "$parent",
as: "p",
cond: {
$eq: [
"$$p.num",
match.invite.num
]
}
}
},
child: {
$filter: {
input: "$child",
as: "ch",
cond: {
$eq: [
"$$ch.num",
match.num
]
}
}
}
}
}
])
但你也可以在没有聚合的情况下做类似的事情,但当没有匹配时,你不会得到一个空数组,你只是没有得到键。
Model.find({
$or: [
{
"parent.num": match.invite.num
},
{
"child.num": match.num
}
]
},
{
parent: {
$elemMatch: {
num: match.invite.num
},
},
child: {
$elemMatch: {
num: match.num
}
}
})