您好我正在开发MeteorJS应用程序,我坚持更新子子数组元素。
这是一个民意调查应用程序,我有以下数据库结构:
在每个问题下都有选项,当用户点击某个选项的按钮时,我想逐个增加选项,每个用户应该对每个问题都有一个投票权。
从按钮,我传递name和questionId数据,以便找到增加投票的正确选项。我应该在questionId中找到具体问题,然后在Options下找到名称的具体数组。
我被困在哪里是找不到的。
请帮忙,谢谢
收藏品名称:民意调查
每个民意调查都有以下结构:
var geo = mesh.geometry; // assuming this Geometry and not BufferGeometry
var verts = geo.vertices;
var faces = geo.faces;
// vertices are used in multiple faces with different normals
// we want to translate the vertex along the average normal
// first, I collect all normals for each vertex
// (it's a bit quick and dirty as I add a normals property to the Vector3 object)
for(var i=0; i<faces.length; i++) {
// vertex a
var va = verts[faces[i].a];
if(va.normals) va.normals.push( faces[i].vertexNormals[0] ); // add normal to collection
else va.normals = [ faces[i].vertexNormals[0] ]; // otherwise create array with first element
// vertex b
var vb = verts[faces[i].b];
if(vb.normals) vb.normals.push( faces[i].vertexNormals[1] );
else vb.normals = [ faces[i].vertexNormals[1] ];
// vertex c
var vc = verts[faces[i].c];
if(vc.normals) vc.normals.push( faces[i].vertexNormals[2] );
else vc.normals = [ faces[i].vertexNormals[2] ];
}
// then iterate over vertices, compute average normal, and translate vertex
for(i=0; i<verts.length; i++) {
var v = verts[i];
var normal = computeAverageNormal( v.normals );
normal.multiplyScalar( offsetAmount );
v.add( normal );
}
geo.verticesNeedUpdate = true;
function computeAverageNormal(normals) {
var n = new THREE.Vector3();
for(var i=0; i<normals.length; i++) {
n.add( normals[i] );
}
n.normalize();
return n;
}
答案 0 :(得分:1)
您可以使用$并对两个或多个表达式的数组执行逻辑AND运算。
{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
这里的第一个表达式是用questionId来获得问题。
'question.questionId': "xgYQxGxpwBXaQpjXN"
第二个表达式,用于指定options数组中具有匹配名称的对象。 要在options数组中找到名称对象,可以使用$ elemMatch来指定查询。
{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
获取名称为“John”的options数组中的对象。
'question.options': {
$elemMatch: {
name: "John"
}
}
最后,使用$ inc增加投票率(此处为1)。 它将获得第一个匹配元素(带$)。
'question.options.$.votes': 1
这是完整的代码:
db.Polls.update({
$and: [{
'question.questionId': "xgYQxGxpwBXaQpjXN"
},
{
'question.options': {
$elemMatch: {
name: "John"
}
}
}
]
}, {
$inc: {
'question.options.$.votes': 1
}
})