如何在javascript中克隆mongoose查询对象

how to clone the mongoose query object in javascript

本文关键字:mongoose 查询 对象 javascript      更新时间:2023-09-26

我面临着克隆mongoose query对象的问题。Javascript通过call-by-ref将一个对象复制到另一个对象中,但在我的项目中,有一种情况我需要通过call-by-value. 将一个物体复制到另个物体中

    var query=domain.User.find({
            deleted: false,
            role: role
        })
var query1=query;

我发现查询对象中的场景变化没有反映在query1中。我在谷歌上搜索并尝试了很多方法来克隆对象,但都不起作用。查询对象在另一个函数中用于分页,query1对象用于计数查询。

1.我习惯了Object.clone(query1)错误Object.clonne不起作用2.我使用了Object.assign(query1),但它不能正常工作。3.我用了其他很多方法,有人能帮我解决这个问题吗?

使用merge方法的替代解决方案:

const query = domain.User.find({
  deleted: false,
  role: role
}).skip(10).limit(10)
const countQuery = query.model.find().merge(query).skip(0).limit(0)
const [users, count] = await Promise.all([query, countQuery.count()])

您正试图克隆一个游标,但这不是正确的方法,您可能只需要创建另一个

像这样:

var buildQuery = function() {
  return domain.User.find({
    deleted: false,
    role: role
  });
};
var query = buildQuery();
var query1 = buildQuery();

这是我的工作:

const qc = sourceQuery.toConstructor();
const clonedQuery = new qc();

这段代码在分页函数中工作,其中sourceQuery作为参数传递,我不知道使用了什么模型。它还可以处理聚合和复杂查询。

  public async paging(
    query: mongoose.DocumentQuery<mongoose.Document[], mongoose.Document>,
    params,
    transformer: any = null
  ) {
    let page = Number(params.page);
    if (!page) page = 1;
    let page_size = Number(params.count);
    if (!page_size) page_size = 100;
    const qc = query.toConstructor();
    const cq = new qc();
    return cq.countDocuments().exec()
      .then(async (total) => {
        const s = params.sort;
        if (s) {
          query.sort(s);
        }
        query.limit(page_size);
        query.skip(page_size * (page - 1));
        let results = await query.exec();
        if (transformer) {
          results = await Promise.all(results.map((i) => transformer(i)));
        }
        const r = new DtoCollection();
        r.pages = Math.ceil(total / page_size);
        r.total = total;
        (r.results as any) = results;
        return r;
      });
  }

Sergii Stotskyi的回答很好,非常优雅,只是count被弃用了。

应该使用CCD_ 9或CCD_。

但是,这会导致错误the limit must be positive。我们可以通过将limit设置为一个大整数来绕过这个问题。

const query = domain.User.find({
  deleted: false,
  role: role
}).skip(10).limit(10)
const countQuery = query.model.find().merge(query).skip(0).limit(Number.MAX_SAFE_INTEGER)
const [users, count] = await Promise.all([query, countQuery.countDocuments()])

由于mongoose v6,您可以使用Query.prototype.clone

例如,对于您的代码片段:

const query = domain.User.find({
  deleted: false,
  role: role
})
const query1 = query.clone();