MongoDB查询中的函数

voase2hg  于 2023-02-08  发布在  Go
关注(0)|答案(2)|浏览(124)

我想知道是否有可能通过在选项块或其他东西中包含一个函数来利用MongoDB查询中的函数。
假设我的数据库集合有一个文档:

{"year": "2320"}

我有函数来格式化这个文档的年份字段:

const reformat = function(input){
 return input.year.substring(2,4)+input.year.substring(0,2)
}

我将调用一个fetch函数,如下所示:

const test = {"year": "2023"}
fetchSomething(test, {}, reformat)

我的fetch函数如下所示:

async function fetchSomething(query, projection, options){
  const dat = await mongoCli.db("testDB").collection("testCollection").findOne(query, projection, options);
  return dat;
}

因此,reformat-function应该修改数据库的文档以匹配test变量的year属性,而不是相反。
我不确定MongoDB是否支持它。查看MongoDB文档...

eyh26e7m

eyh26e7m1#

你能做的就是这样:

const reformat = function(){
 return {allowDiskUse: true}
}

mongoCli.db("testDB").collection("testCollection").findOne(query, projection, reformat());

optionfindOne的输入属性,不能重新定义。
或者,您可以在聚合管道中使用$function

db.mongoCli.aggregate([
   {
      $set: {
         year: {
            $function: {
               body: function (input) {
                  return input.year.substring(2, 4) + input.year.substring(0, 2)
               },
               args: ["$$ROOT"],
               lang: "js"
            }
         }
      }
   }
])

请注意,在聚合表达式内执行JavaScript可能会降低性能。仅当提供的管道运算符无法满足应用程序的需要时,才使用$function运算符。$substrCP$concat也可用作管道运算符。

lb3vh1jj

lb3vh1jj2#

我现在意识到我可以用一个光标来完成它:

const reformat = function(input){
 return input.year.substring(2,4)+input.year.substring(0,2)
}

async function fetchSomething(query, options){
  const cursor = await mongoCli.db("testDB").collection("testCollection").find()
  let doc;
  while (await cursor.hasNext()) {
    doc = await cursor.next();
    if (options(doc) == query.year){ break; }
    else { doc = null; }
  }
  cursor.close();
  return doc;
}
const test = {"year": "2023"}
fetchSomething(test, reformat)

不过,也许有更好的办法。

相关问题