簡體   English   中英

如何在javascript中克隆mongoose查詢對象

[英]how to clone the mongoose query object in javascript

我面臨着mongoose query對象的克隆問題。 Javascript call-by-ref將一個對象復制到另一個對象中,但在我的項目中,我需要call-by-value.將一個對象復制到另一個對象中call-by-value.

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

var query1=query;

我有查詢對象中的場景更改未反映在query1 我谷歌並嘗試了很多方法來克隆對象,但它不起作用。查詢對象在另一個函數中用於分頁,而query1對象用於計數查詢。

1.我習慣於 Object.clone(query1) 錯誤 Object.clone is not function 2.I used Object.assign(query1) 但它不能正常工作。 3.我用了很多其他方法誰能幫我解決這個問題

您正在嘗試克隆游標,但這不是正確的方法,您可能只需要創建另一個

像這樣:

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

var query = buildQuery();
var query1 = buildQuery();

使用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()])

這對我來說是工作:

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

應使用countDocumentsestimatedDocumentCount來代替。

但是,這會導致錯誤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()])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM