Javascript MongoDB查找字段不存在的所有文档';t存在,加上如果存在应用字段运算符($max)条件
我正在查找聚合中的Javascript MongoDB查找字段不存在的所有文档';t存在,加上如果存在应用字段运算符($max)条件,javascript,mongodb,mongoose,mongodb-query,aggregation-framework,Javascript,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我正在查找聚合中的$match阶段的查询,该阶段的功能几乎与,as,but.相同 若文档中不存在字段(在我的例子中命名为rank),请将文档添加到结果中 但如果字段存在,则将条件(在我的示例中是)应用于此字段,并将所有符合此条件的文档添加到结果中 结果应该是这样的: [ { "method": 3, "item": 1, "rank": 3 //because it has field named rank, and suits condition {rank:
$match
阶段的查询,该阶段的功能几乎与,as,but.相同
- 若文档中不存在字段(在我的例子中命名为rank),请将文档添加到结果中
- 但如果字段存在,则将条件(在我的示例中是)应用于此字段,并将所有符合此条件的文档添加到结果中
[
{
"method": 3,
"item": 1,
"rank": 3 //because it has field named rank, and suits condition {rank: $max}
},
{
"method": 4,
"item": 1 //we need this, because document doesn't have rank field at all
},
{
"method": 5,
"item": 1 //we need this, because document doesn't have rank field at all
}
]
我已经尝试过的事情:
{
$match: {
$or: [
{item: id, rank: {$exists: true, $max: "$rank"}}, //id === 1
{item: id, rank: {$exists: false}} //id === 1
]
}
}
UPD:到目前为止,我可能不会仅限于$match
阶段,$project
在默认匹配之后也是相关的,因此我可以通过id
请求$match
阶段中的每个文档,不管文档是否排序字段,然后在$project
阶段进行“分离”按等级$exists
试试这个:
db.collection.aggregate([
{
$match: {
item: id
}
},
{
$group: {
_id: "$item", //<- Change here your searching field
max: {
$max: "$rank" //<- Change here your field to apply $max
},
data: {
$push: "$$ROOT"
}
}
},
{
$unwind: "$data"
},
{
$match: {
$expr: {
$or: [
{
$eq: [
{
$type: "$data.rank"
},
"missing"
]
},
{
$eq: [
"$data.rank",
"$max"
]
}
]
}
}
},
{
$replaceWith: "$data"
}
])
db.collection.aggregate([
{
$match:{
项目:id
}
},
{
$group:{
_id:“$item”,//我找到了一个答案,与@Valijon的方法不同,但它也是基于上述逻辑。我的查询是:
db.collection.aggregate([
{
$match: {
item: id
}
},
{
$project: {
method: 1,
item: 1,
rank: {
$ifNull: [
"$rank",
0
]
}
}
},
{
$group: {
_id: "$item",
data: {
$addToSet: "$$ROOT"
},
min_value: {
$min: "$rank"
},
max_value: {
$max: "$rank"
}
}
},
{
$unwind: "$data"
},
{
$match: {
$or: [
{
$expr: {
$eq: [
"$data.rank",
"$max_value"
]
}
},
{
$expr: {
$eq: [
"$data.rank",
"$min_value"
]
}
},
]
}
}
])
我的查询基于$project
阶段,该阶段给出了空字段值0。它也可以是-1,也可以是集合中未使用的任何值。然后我分离结果
不清楚您想做什么…在示例+预期结果中,您跳过了前两个文档…请提供有效的示例/预期结果…@Valijon是吗?我想查找集合中没有特定字段的每个文档,但如果有,则将应用条件应用于此字段。此条件应具有field操作员。猜猜,再简单不过了。现在它更清楚了,谢谢。检查我的回答,谢谢你,你比我更快/更好,所以我接受它作为答案。另外,我目前正在基于$project
stage和$ifNull
开发变体。