Mongodb

MongoDB Shell 支持 map.set()

  • May 6, 2021

我正在嘗試使用 MongoDB shell 來執行一些腳本。var map = new Map()在我嘗試執行的 JavaScript 內部map.set(1,1)

但是,我收到以下錯誤:

E QUERY    [js] TypeError: map.set is not a function :

我正在執行這個mongoshell 版本:MongoDB shell version v4.2.1

mongoshell不支持這個功能map.set()嗎?

不,他們在implscope.cpp中隱藏了標準實現

// 這個內置地圖是 javascript 6 的東西。我們想要我們的版本。所以//把他們的拿出來

並在types.js中實現一個新的。

好吧,您可以解決方法:

Map.prototype.set = Map.prototype.put

MongoDB shell 目前實現了自己的自定義Map類型,而不是 ECMAScript 6Map類型。在不同之處中,MongoDB 類型使用put而不是set向地圖添加元素。這解釋了為什麼您會看到“map.set 不是函式”錯誤。

此自定義地圖類型的三個 API 函式是“get”、“put”和“values”。

> new Map();
{
   "_data" : {
       
   },
   "put" : function(key, value) {
   var o = this._get(key);
   var old = o.value;
   o.value = value;
   return old;
},
   "get" : function(key) {
   return this._get(key).value;
},
   "_get" : function(key) {
   var h = Map.hash(key);
   var a = this._data[h];
   if (!a) {
       a = [];
       this._data[h] = a;
   }
   for (var i = 0; i < a.length; i++) {
       if (friendlyEqual(key, a[i].key)) {
           return a[i];
       }
   }
   var o = {key: key, value: null};
   a.push(o);
   return o;
},
   "values" : function() {
   var all = [];
   for (var k in this._data) {
       this._data[k].forEach(function(z) {
           all.push(z.value);
       });
   }
   return all;
}
}

MongoDB 問題SERVER-46243於 2020 年 2 月創建,並建議改用標準 ECMAScriptMap類型。實施此更改後,您目前的程式碼將起作用。

總之,如果您更改set為,您的範常式式碼應該按原樣工作put

var map = new Map();
map.put(1, 1);

mongosh 請注意,這在新的MongoDB Shell(目前處於 Beta 版)中不再是問題,因為它使用標準的 ECMAScript 6Map類型。2021 年 4 月對上述票證的評論中提到了這一點:

此功能在我們的新 MongoDB Shell ( mongosh)中可用

$$ … $$. mongosh仍處於測試階段,但它應該具有您需要的大部分功能。$$ … $$我們正準備在今年晚些時候進行 GA$$ … $$.

引用自:https://dba.stackexchange.com/questions/253561