Moongoose 3.8.8 是不是支持 $position 运算符?

Posted

技术标签:

【中文标题】Moongoose 3.8.8 是不是支持 $position 运算符?【英文标题】:Does Moongoose 3.8.8 support $position operator?Moongoose 3.8.8 是否支持 $position 运算符? 【发布时间】:2014-05-28 14:34:42 【问题描述】:

Moongoose 3.8.8(最新版本)是否支持来自 MongoDB 2.6.0 的 $position (http://docs.mongodb.org/manual/reference/operator/update/position/) 运算符?

在以下代码示例中,新元素被插入到数组 userActivity.activities 的末尾:

型号:

var userActivity = new schema(
    userId: type:String, required:true, unique:true,
    activities: [activity]
);

var activity = new schema(
    act: type: Number, required:true,
);

查询:

var activity =  act: 1 ;

model.userActivity.update(
 _id: dbact._id ,
 $push:  activities: 
                $each: [ activity ],
                $position: 0
            
         
,
function (err, numAffected) 
    if (!err) 
    // do something
    
);

【问题讨论】:

【参考方案1】:

这实际上无关紧要,对于任何“框架”实现都无关紧要,我不介意解释原因。

每个“框架”(例如 Mongoose、Mongoid、Doctrine、MongoEngine 等)基本上都建立在基本的“驱动程序”实现之上,该实现在大多数情况下是由 MongoDB 员工自己开发的。因此,即使您需要“深入”到某个级别才能使用那些“本机”方法,基本功能也始终存在。


因此,在这种情况下,这将是本机用法示例:

List.collection.update(
,
 "$push": 
    "list": 
      "$each": [ 1, 2, 3 ],
      "$position": 0 
    
,function(err,NumAffected) 
  console.log("done");

);

注意模型中使用的“收集”方法,它从驱动程序获取“原始”收集详细信息。所以你使用的是它的方法,而不是一些可能进行额外处理的“包装”方法。


下一个也是最基本的原因是如果你找不到你需要的运算符的方法和应用,这是一个简单的事实。

每个框架和基本驱动程序方法中的方法使用的每个操作本质上都是对基本 API 中的“runCommand”方法的调用。因此,由于该基本调用随处可用(以某种形式或另一种形式,因为它必须如此),那么您可以使用 any 框架上的每种语言实现来执行您在 MongoDB 网站上宣传的所有内容。

但是对您的特定请求的简短调用是,因为这实际上不是 方法 调用,而只是传入的 BSON 参数的一部分,所以当然没有特定的限制语言驱动程序来实际使用它。

因此,您当然可以使用这些新参数,而无需更新到最新版本。但如果你真的这样做了,你可能会得到一些很好的方法。

【讨论】:

感谢您的澄清!不幸的是,$push 和 $position 似乎不起作用(我使用最新的 MongoDb 2.6 和最新的 Mongoose 3.8.8) - $position 运算符被忽略,新元素被插入到数组的末尾!跨度> @Roman 如答案中所述,这与猫鼬无关。如果您使用 2.6 没有得到预期的结果,那么您的语法是错误的。数组索引从 0 作为第一个元素开始。因此,如果这仍然是一个问题,那么您最好展示您的陈述,而不是仅仅问“它是否有效” @Roman 所以我通常解释的是,现在已经包含了一个示例,你总是可以在每个框架中进入“原始”驱动程序级别。因此,虽然 mongoose 方法似乎与提供的更新文档混淆,但原始驱动程序的使用将按预期工作。查看编辑中的代码。 不幸的是,它对我还不起作用.. MongoDB 2.6.0 和 Mongoose 3.8.8。我不知道我做错了什么。我尝试过 "$push"-"$each"-"$position" (如您的示例)和 $push-$each-$position (如以下消息) 是的!但似乎这仅适用于文档中的嵌套数组。对于“subdocument.list”,这不起作用: List.collection.update(, "$push": "subdocument.list": " $each": [ 1, 2, 3 ], "$position": 0 我是不是又做错了什么?【参考方案2】:

是的,你应该可以直接使用它,因为 Mongoose 将 pass through 更新子句:

Model.update(
  query, /* match the document */ 
   $push: 
        yourArrayField: 
                 
                    $each: [ 1, 2, 3 ],
                    $position: 0
                 
       
  , function (err, res)  /* callback */ );

上面将在名为yourArrayField 的数组的前面插入值1, 2, 3

由于它只是一个传递,您需要确保它适用于您将客户端连接到的服务器版本。

【讨论】:

以上是关于Moongoose 3.8.8 是不是支持 $position 运算符?的主要内容,如果未能解决你的问题,请参考以下文章

支持 ngettext 样式复数的 GNU gettext PO 文件的 Google 翻译服务

在 CentOS 7 上安装 RabbitMQ

DALI调色温

EBS 中PO模块 里的 收单方在哪张表里 注意不是ID啊?

mongoose V7.4核心篇之HTTP特定协议回调函数

计算过滤和分组后的平均值