[英]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
。
應使用countDocuments
或estimatedDocumentCount
來代替。
但是,這會導致錯誤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.