【问题标题】:convert array of objects to mongoose query?将对象数组转换为猫鼬查询?
【发布时间】:2014-04-21 08:02:18
【问题描述】:

我有一个像这样的猫鼬查询数组

var q = [{"_id":'5324b341a3a9d30000ee310c'},{$addToSet:{"Campaigns":'532365acfc07f60000200ae9'}}]

我想将它们应用到像这样的猫鼬方法

var q = [{"_id":'5324b341a3a9d30000ee310c'},{$addToSet:{"Campaigns":'532365acfc07f60000200ae9'}}] Account.update.apply(this, q);

我该怎么做?如何将一组 mongoose 查询对象转换为 mongoose 参数?

我尝试了以下方法,但不起作用。

变量 q = [{ “_id”:'5324b341a3a9d30000ee310c' }, { $addToSet: { “活动”:'532365acfc07f60000200ae9' } }] Account.update(q).exec(function (e, r) { 控制台日志(r) console.log('错误') 控制台.log(e) console.log('错误') cb(e, r); });

【问题讨论】:

  • 为什么不只传递两个参数?
  • 因为我从函数参数参数中获取数组。 function(){ var args = Array.prototype.slice.call(arguments, 0);}
  • 好的 -- 我添加了向您展示如何使 apply 正常工作的答案。

标签: mongodb mongoose


【解决方案1】:

您需要做的就是通过apply 将正确的对象上下文传递给update 方法:

Account.update.apply(Account, q)
    .exec(function(e, r) {
    // your code here ...
});

this 必须是 Model 实例,而不是全局范围上下文(或者在调用它时可能是其他任何 this)。

【讨论】:

    【解决方案2】:

    基本上似乎只是传递函数原型的方式。因此,如果您想动态构建参数,则需要执行以下操作:

    var q = [
      { "_id": account._id },
      { "$addToSet": { "Campaigns": campaign._id } },
    ];
    
    Account.update( q[0], q[1], (q[2]) ? q[2] : {}, function(err, num) {
    

    基本上,您总是将 query、update 和 options 文档作为参数传递。这使用三元条件将 empty {} 文档作为 options 参数放入,而它在您的动态条目中不存在。

    【讨论】:

    • 是的,这似乎是最好的方法。谢谢!
    • 传递给应用的上下文不正确。见我的answer。
    • @WiredPrairie 当我测试它并且它有效时,它不会是不正确的。也许你误读了回复。
    • 我的意思是原始问题中的 this 上下文。不是你的答案。你的也可以。
    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多