如何在javascript中克隆mongoose查询对象
how to clone the mongoose query object in javascript
我面临着克隆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();
相关文章:
- 在mongoose中使用正则表达式在对象数组中进行查询搜索
- Mongoose查询嵌套文档的时间或多或少为某个日期
- Mongoose查询在两个日期时间之间提取数据
- 如何在javascript中克隆mongoose查询对象
- Mongoose查询阻塞Node.js
- mongoose查询返回链接到用户的产品
- Node.js:从mongoose查询返回正确的JSON
- 无法向 Mongoose 查询返回的对象添加新属性
- 通过AngularJS中的按钮点击/滚动来增加Mongoose查询限制
- 使用多个ObjectId的Mongoose查询(带有'ref')
- Mongoose查询没有't返回错误
- 如何使用AND和OR进行条件Mongoose查询
- Mongoose查询被馈送到数组中
- 在mongoose查询和保存期间,javascript推送到循环内部的数组
- 如何在mongodb / mongoose查询中改变基于参数的结果位置
- 使用Mongoose查询是正确的,但是forEach之后数组总是空的.Nodejs / MongoDB
- 在BSON文档中向来自Mongoose查询的数组中添加项时的意外行为
- 如何修改从Mongoose查询返回的数据?
- Mongoose查询以在多个数组中查找匹配的元素
- 带有通配符的Mongoose查询Where子句