javascript - 在 MONGODB 上使用 $in 和 $and 在我的情况下不起作用

标签 javascript jquery node.js mongodb express

我正在使用 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 对相关问题的回答) - 使用更强大的版本,因为它对数组、正则表达式和日期有适当的支持:

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

关于javascript - 在 MONGODB 上使用 $in 和 $and 在我的情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695897/

相关文章:

javascript - 在 Twitter 的关注按钮中隐藏单词 "followers"

带有箭头的 jQuery 切换下拉菜单

javascript - API输出结果

node.js - 在 Node js 中使用 'require' 以获得更好的性能

java - 在 ActiveMq 中将 JSON 消息转换为 javax.jms.ObjectMessage

javascript - 将单词秒转换为周、天、小时和分钟

javascript - 如何在 IE 9 中调试 JavaScript?

javascript - 不用jquery模拟按键

javascript - 使用jQuery根据scrollTop位置显示div

javascript - Node.js 设置了错误的内容长度。我该如何设置这个