有关MongoDB的”$”操作符的笔记

以下是关于MongoDB的”$”运算符用法的备忘录,我常常会忘记,所以写下来作为提醒。
这基本上只是直接引用了官方文档,没有做任何修改。

(投影)

参考来源:http://docs.mongodb.org/manual/reference/operator/projection/positional/#proj._S_

只返回查询结果中数组中第一个匹配的元素。给出具体例子。

var docs = [
  { "_id": 1, "semester": 1, "grades": [ 70, 87, 90 ] },
  { "_id": 2, "semester": 1, "grades": [ 90, 88, 92 ] },
  { "_id": 3, "semester": 1, "grades": [ 85, 100, 90 ] },
  { "_id": 4, "semester": 2, "grades": [ 79, 85, 80 ] },
  { "_id": 5, "semester": 2, "grades": [ 88, 88, 92 ] },
  { "_id": 6, "semester": 2, "grades": [ 95, 90, 96 ] }
];

docs.forEach(function(d) {
  db.sample_find.insert(d);
});
db.sample_find.find(
  { "semester": 1, "grades": { "$gte": 85 } },  //semesterが1、かつgradesが85以上の要素を含むドキュメントを検索する
  { "grades.$": 1 }  //検索結果のgrades配列で最初に一致する要素だけ返す
);
//結果
{ "_id": 1, "grades": [ 87 ] }
{ "_id": 2, "grades": [ 90 ] }
{ "_id": 3, "grades": [ 85 ] }
db.sample_find.find( { "semester": 1, "grades": { "$gte": 95 } }, { "grades.$": 1 } )
//結果
{ "_id": 3, "grades": [ 100 ] }

(更新)

请参考以下链接:http://docs.mongodb.org/manual/reference/operator/update/positional/

不需要明确指定数组的索引,可以定位要更新的数组元素。
这里举一个具体的例子。

var docs = [
  {
    "_id": 4,
    "grades": [
      { "grade": 80, "mean": 75, "std": 8 },
      { "grade": 85, "mean": 90, "std": 5 },
      { "grade": 90, "mean": 85, "std": 3 }
    ]
  }
];

docs.forEach(function(d) {
  db.sample_update.insert(d);
});
db.sample_update.update(
  { "_id": 4, "grades.grade": 85 },
  { "$set": { "grades.$.std": 6 } }  //条件に一致する配列要素のstdを6に更新する
);

//検索
db.sample_update.find( { "_id": 4 } );
//結果
{
  "_id": 4,
  "grades": [ 
    { "grade": 80, "mean": 75, "std": 8 },
    { "grade": 85, "mean": 90, "std": 6 },  //stdが6に更新された
    { "grade": 90, "mean": 85, "std": 3 }
  ]
}
db.sample_update.update(
  { "_id": 4, "grades.grade": { "$gte": 85 } },
  { "$set": { "grades.$.std": 10 } }  //条件に一致する配列要素のstdを10に更新する
);

//検索
db.sample_update.find( { "_id": 4 } );
//結果
{
  "_id" : 4,
  "grades" : [
    { "grade": 80, "mean": 75, "std": 8 }, 
    { "grade": 85, "mean": 90, "std": 10 },  //stdが10に更新された
    { "grade": 90, "mean": 85, "std": 3 }  //こちらのstdは更新されないみたい。。
  ]
}

根据第二个示例更新,分数为90的学生未被更新。与投影操作类似,只有满足条件的数组中的第一个元素才会被更新。

广告
将在 10 秒后关闭
bannerAds