我试图在数组中找到对象的索引并返回该索引,以便我可以使用返回的索引更新我的集合。在mongoDb中考虑这个结构:
{
"_id" : ObjectId("571e32d44990e27409df4bb5”),
"association" : ”f",
"events" : [
{
"event" : ”eventtest”,
"students" : [
{
"session" : "beP--kELak7gcFQLN6-o_AdTkJA8eYcp",
"name" : ”Student",
"email" : ”email@example.com”,
"checkedIn" : false
},
{
"name" : "newstudent",
"email" : "newemail",
"checkedIn" : false
}
]
}
}
当我以表格形式输入学生电子邮件时,我想将其设置为" checkedIn"值为true。使用mongodb,express和node js这是我迄今为止所做的:
MongoClient.connect(url, function(err, db){
if (err){
console.log("Unable to connect to server");
} else {
console.log('Connected to server');
var collection = db.collection('associations');
//indexes should be set dynamically where the emails match
var eventIndex = 0;
var studentIndex = 1;
var setModifier = { $set: {} };
setModifier.$set['events.' + eventIndex + '.students.' + studentIndex + '.checkedIn'] = true;
collection.update({
association: assoc,
"events.event": event,
"events.students.email": req.body.email
}, setModifier, function(err, user){
if(err) {
console.log(err);
} else{
res.redirect("checkin");
}
db.close();
});
}
});
这很好用,我需要查询学生,例如," newemail"并将studentIndex设置为1,并为该事件返回值0:" eventtest"。
我发现您可以使用mapReduce或聚合来查找数组中的项索引,但我不确定这是否适用于对象,我不知道从哪里开始。有人建议在客户端处理这个问题,因为mapReduce一开始并不值得推荐,但这似乎很麻烦。
以下是一些链接,可能会对我试图完成的事情有所了解。
Retrieve only the queried element in an object array in MongoDB collection
Retrieve index of item in array in MongoDB
Using MongoDB's positional operator $ in a deeply nested document query
function to return index of an object in a deeply nested array
编辑: 我发现这篇文章也是Mongodb sort inner array
如果我聚合学生的内部数组并对学生对象进行排序,以便匹配电子邮件的相应学生在列表顶部排序,同时仍然保留整个文档中的其余结构,那么它可能有用。相同。这样,应该签入的学生的索引始终为0?这是不好的做法吗?在我看来,这对于一项相当简单的任务来说是一件很麻烦的事。