我正在使用 MONGOHQ 和 NODE.JS 来制作应用程序,我真的很需要有人的帮助,因为我有一个大问题,我尝试了一切并到处寻找,所以这是我最后的选择。
我在 Node 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"
}
有人有想法吗? 我很高兴听到!
谢谢
迈克尔
最佳答案
您的问题没有具体说明为什么您不想修改 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...
方法,因为它不会不必要地复制原型(prototype)属性 [尽管有时您可能需要这样做],但它对您的情况没有影响。)
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 不提供 native 函数来执行此操作。这是一个深度复制函数(来 self 对相关问题的回答) - 使用更强大的版本,因为它对数组、正则表达式和日期有适当的支持:
关于javascript - 在 MONGODB 上使用 $in 和 $and 在我的情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695897/