我正在使用MONGOHQ和NODE.JS来制作一个应用程序,我真的很喜欢某人的帮助,因为我有一个大问题,我尝试了所有的东西并且到处寻找,所以这是我最后的选择。
我在节点JS帖子上有这个查询:
{ propertyId: '53f4f097f28c16cf87a15664' }
此查询正在此处使用:
db.collection('animal').find(req.body.query).toArray(function (err, animals) {
res.send(
(err === null) ? { status: 'ok', result: animals } : { status: err }
);
});
它的工作很精细!
现在出现问题:
我想要的是在查找中添加另一个查询,而不修改req.body.query。
我所拥有的是_id(不是ObjectIds)的列表,名为myArray,它就像:
[ '12312123' , '78787878' ]
所以我这样做:
db.collection('animal').find({ $and : [ req.body.query, { '_id' : { $in : myArray} } ] }).toArray(function (err, animals) {
res.send(
(err === null) ? { status: 'ok', result: animals } : { status: err }
);
});
它给了我一个空列表。
但相反,如果我在mongohq上做同样的查询,如:
find({$and : [ { propertyId: '53f4f097f28c16cf87a15664' }, { '_id' : { $in :['12312123', '78787878']} } ] })
它给我一个列表,其中包含符合条件的1个元素:
{
_id: "12312123",
propertyId: "53f4f097f28c16cf87a15664",
active: "true"
}
有没有人有想法? 我很高兴听到!
由于
迈克尔
答案 0 :(得分:0)
你的问题没有说明为什么你不想修改req.body.query
,但可能有很多原因,所以这里是你如何在修改之前复制它,这样你就不会甚至不需要打扰$and
:
var query = req.body.query;
//make a copy of the query object
var queryCopy = {};
for (var i in query) {
queryCopy[i] = query[i];
}
//add your additional conditions
queryCopy._id: { $in : myArray} };
var result = db.collection('animal').find(queryCopy);
//result.toArray(...)
请注意,此方法仅创建对象的浅表副本,在这种情况下很好,因为您不修改任何嵌套对象或数组。如果你想要你可以添加一个用于创建浅拷贝的函数,可以使用(我更喜欢使用Object.keys()
这个泛型函数而不是上面的var i in...
方法,因为它不会不必要地复制原型属性[虽然有时你可能会想要],但它对你的情况没有影响。)
function shallowCopy(obj) {
var copy = {},
keys = Object.keys(obj),
len = keys.length;
for (var i=0; i < len; i++) {
copy[keys[i]] = obj[keys[i]];
}
return copy;
}
如果您需要创建对象的深层副本,因为您想要修改嵌套对象和数组而不影响原始对象,那么您需要使用专门为此目的设计的函数,因为Javascript不会提供本机功能来做到这一点。这是一个深层复制功能(从我对这个问题的答案) - 使用更强大的版本,因为它对数组,正则表达式和日期有适当的支持: