在MongoDB中查找并替换子子数组元素

时间:2017-04-05 15:03:25

标签: arrays mongodb meteor multidimensional-array

您好我正在开发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;
}

1 个答案:

答案 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
    }
})