Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 根据某些条件检索mongodb文档_Node.js_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

Node.js 根据某些条件检索mongodb文档

Node.js 根据某些条件检索mongodb文档,node.js,mongodb,mongoose,mongodb-query,Node.js,Mongodb,Mongoose,Mongodb Query,我尝试使用Node.JS从MongoDB集合中检索数据,该集合满足一些条件。我有一个名为Events的集合,其中包含人数、类别和用户。事件文档的一个示例: { "category":"123", "number_of_persons":3, "users_attended":["345","456","567","786&

我尝试使用Node.JS从MongoDB集合中检索数据,该集合满足一些条件。我有一个名为Events的集合,其中包含人数、类别和用户。事件文档的一个示例:

{ 
    "category":"123",
    "number_of_persons":3,
    "users_attended":["345","456","567","786"]
}
Users\u attended是对UserAttended集合的引用,该集合具有字段id、user、accepted和Cancelled。 例如:

查询有一个类别数组,如['123'、'1234'、'12345'],我应该返回此数组中具有类别id的所有事件。此外,categories向量可以是空数组,在这种情况下,我应该返回所有事件,而不按类别过滤。查询的另一个条件是,如果用户参与的引用的条目数accepted=truecancelled=false小于事件人数(3)。我应该用聚合来实现这一点,我尝试用$in操作符来实现类别,用$map来实现用户,但没有结果。有人能帮我吗

感谢您的管理器文件(包含查询的node.js文件)中的将此条件设置为空时跳过对
类别的检查

let条件={};
if(Array.isArray(categories)和&categories.length>0){
条件={
“类别”:{
$in:categories//可以具有类似[“1234”、“123”]的值
}
}
}
eventsModel.aggregate([
{$match:condition},
//查询的其余部分如下所示
请尝试以下查询:

db.events.aggregate([
{
$match:{
“类别”:{
$in:[“1234”,“123”]
}
}
},
{
$lookup:{
来自:“用户参与”,
let:{users\u attered:“$users\u attered”},
管道:[
{
$match:{
“接受”:正确,
“取消”:错误,
$expr:{$in:[“$\u id”,“$$users\u attended”]}
}
}
],
as:“用户参加”
}
},
{
$match:{
$expr:{
$gt:[“$number\u of_persons”,{$size:$users\u attended”}]
}
}
}
]);
输出:

{
“_id”:ObjectId(“60310979127FAC324C48F0D9”),
“类别”:“123”,
“人数”:3人,
“用户参与”:[
{
“_id”:ObjectId(“603108bf127fac3244c8f0d3”),
“用户”:“1”,
“接受”:正确,
“已取消”:false
},
{
“_id”:ObjectId(“603108bf127fac3244c8f0d4”),
“用户”:“2”,
“接受”:正确,
“已取消”:false
}
]
}
以下是我的
事件
集合的外观:

/*1创建日期:2021年2月20日下午6:37:05*/
{
“_id”:ObjectId(“60310979127FAC324C48F0D9”),
“类别”:“123”,
“人数”:3人,
“用户参与”:[
目标(“603108BF127FAC324C4C8F0D3”),
ObjectId(“603108BF127FAC324C4C8F0D4”),
ObjectId(“603108BF127FAC324C4C8F0D5”)
]
},
/*创建日期:2021年2月20日,下午6:37:05*/
{
“_id”:ObjectId(“60310979127fac3244c8f0da”),
“类别”:“1234”,
“人数”:3人,
“用户参与”:[
ObjectId(“603108BF127FAC324C4C8F0D6”),
ObjectId(“603108BF127FAC324C4C8F0D7”),
ObjectId(“603108BF127FAC324C4C8F0D8”)
]
}
这就是我的
UserAttended
收藏的外观:

/*1创建日期:2021年2月20日下午6:33:59*/
{
“_id”:ObjectId(“603108bf127fac3244c8f0d3”),
“用户”:“1”,
“接受”:正确,
“已取消”:false
},
/*创建日期:2021年2月20日,下午6:33:59*/
{
“_id”:ObjectId(“603108bf127fac3244c8f0d4”),
“用户”:“2”,
“接受”:正确,
“已取消”:false
},
/*创建日期:2021年2月20日,下午6:33:59*/
{
“_id”:ObjectId(“603108BF127FAC324C48F0D5”),
“用户”:“3”,
“接受”:错误,
“已取消”:false
},
/*创建日期:2021年2月20日,下午6:33:59*/
{
“_id”:ObjectId(“603108bf127fac3244c8f0d6”),
“用户”:“4”,
“接受”:正确,
“已取消”:false
},
/*创建日期:2021年2月20日,下午6:33:59*/
{
“_id”:ObjectId(“603108bf127fac3244c8f0d7”),
“用户”:“5”,
“接受”:正确,
“已取消”:false
},
/*6:2021年2月20日下午6:33:59*/
{
“_id”:ObjectId(“603108bf127fac3244c8f0d8”),
“用户”:“6”,
“接受”:正确,
“已取消”:false
}

Hi,这句话:“查询的另一个条件是,如果用户参与的引用的条目数已接受=true,且已取消=false小于事件的人数(3)”不清楚,你能详细说明一下吗?@DheemanthBhat是的,当然可以。用户可以参加一个活动。当他参加一个活动时,他将被插入UserAttended集合(id:1,user:345,accepted:false,Cancelled:false),他的参考将被插入事件集合的user_attended字段(例如,对于事件文档:{id:“1”,category:“123”,user_attended:[“1”],人数:5.每个参加活动的用户都可以被接受(接受将设置为true)或拒绝(接受将保持为false)。@DheemanthBhat当我搜索活动时,我应该只返回有可用时间段的活动(参加的用户人数已字段接受设置为true低于活动人数)。非常感谢您的回答。我认为这是正确的,但我有一个问题。在UserAttended集合中,我没有“id”字段,我只有作为ObjectID的“\u id”,并且此引用插入到user\u attended数组中。我如何通过\u id进行匹配?我尝试将“$id”替换为“$\u id”在匹配表达式中,但没有结果…用
$\u id
替换
$id
对我有效。检查更新后的答案。发布您的
事件
用户参与
架构,可能会让我遗漏一些内容。如果可能,还可以在编写此查询的位置发布代码。检查拼写错误。
{
   "id":"345",
   "user":"1",
   "accepted":true,
   "canceled":false
}