在我的情况下,使用$ in和$和MONGODB不起作用

时间:2014-09-06 01:13:18

标签: javascript jquery node.js mongodb express

我正在使用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"
}

有没有人有想法? 我很高兴听到!

由于

迈克尔

1 个答案:

答案 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不会提供本机功能来做到这一点。这是一个深层复制功能(从我对这个问题的答案) - 使用更强大的版本,因为它对数组,正则表达式和日期有适当的支持:

https://stackoverflow.com/a/13333781/560114