9
Documents.update(
  {_id: Session.get("current_document_id")}, 
  {$push: {schema: {type: "text", size: size, name: name, label: label}}}
);

上記のクエリはMeteorコレクションであり、「Documents.update」はMongoDBドキュメント(http://docs.mongodb.org/manual/applications/update/)の「db.documents.update」にマップされます。そのクエリを使用して、メインドキュメント内にスキーマドキュメントを追加できます。サブドキュメントは配列に格納されます。

Document:
  schema:
    array:
      {type: "text", size: 6, name: "first_name", label: "First name"},
      {type: "text", size: 6, name: "last_name", label: "Last name"}

このクエリでサブドキュメントの名前とサイズの属性を変更したい:

Documents.update(
  {_id: Session.get("current_document_id"), 'schema' : "first_name"}, 
  {$push: {schema: {type: "text", size: 7, name: name, label: "First Name2"}}}
);

ただし、その操作では、スキーマのすぐ下に新しいオブジェクトが追加され、配列が削除されます。

Document:
  schema:
      {type: "text", size: 7, name: "first_name", label: "First Name2"}

この問題を回避するためにクエリを変更して属性を変更するにはどうすればよいですか?クエリの後、私はこのドキュメントが欲しいです:

Document:
  schema:
    array:
      {type: "text", size: 7, name: "first_name", label: "First name2"},
      {type: "text", size: 6, name: "last_name", label: "Last name"}
4

2 に答える 2

22

次のように、位置演算子を使用してセレクターで一致する配列要素を識別する$set操作を使用して、既存の配列要素を更新できます。$

Documents.update(
  {_id: Session.get("current_document_id"), 'schema.name': "first_name"}, 
  {$set: {'schema.$': {type: "text", size: 7, name: name, label: "First Name2"}}}
);

これにより、一致したschema要素がオブジェクトに含まれている要素に置き換えられ$setます。

ターゲットschema要素の個々のフィールドのみを更新する場合は、ドット表記を使用できます。たとえば、フィールドsizenameフィールドのみを更新するには、次のようにします。

Documents.update(
  {_id: Session.get("current_document_id"), 'schema.name': "first_name"}, 
  {$set: {'schema.$.size': 7, 'schema.$.name': name}}
);
于 2012-12-08T16:48:02.210 に答える
1

位置$[]演算子でarrayFiltersを使用できます

以下のmongodbの公式ドキュメントの例では、位置識別子として「elem」を使用しています。


次のドキュメントを含むコレクションstudents2について考えてみます。

{
   "_id" : 1,
   "grades" : [
      { "grade" : 80, "mean" : 75, "std" : 6 },
      { "grade" : 85, "mean" : 90, "std" : 4 },
      { "grade" : 85, "mean" : 85, "std" : 6 }
   ]
}
{
   "_id" : 2,
   "grades" : [
      { "grade" : 90, "mean" : 75, "std" : 6 },
      { "grade" : 87, "mean" : 90, "std" : 3 },
      { "grade" : 85, "mean" : 85, "std" : 4 }
   ]
}

成績が85以上である成績配列内のすべての要素の平均フィールドの値を変更するには、位置$[]演算子とarrayFiltersを使用します。

db.students2.update(
   { },
   { $set: { "grades.$[elem].mean" : 100 } },
   {
     multi: true,
     arrayFilters: [ { "elem.grade": { $gte: 85 } } ]
   }
)
于 2021-03-20T16:29:56.200 に答える