Moongoose 3.8.8是否支持$ position运营商?

时间:2014-04-14 14:56:25

标签: mongodb mongoose mongodb-query

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
    }
});

2 个答案:

答案 0 :(得分:1)

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

每一个“框架”(例如Mongoose,Mongoid,Doctrine,MongoEngine等等)都基本上建立在一个基本的“驱动程序”实现上,在大多数情况下由MongoDB工作人员自己开发。因此,即使您需要“钻研”到某个级别以便使用这些“原生”方法,基本功能也始终如此。


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

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

});

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


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

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

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

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

答案 1 :(得分:1)

是的,您应该可以直接使用它,因为Mongoose会pass through更新条款:

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

以上内容会在名为1, 2, 3的数组前面插入值yourArrayField

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