Does Moongoose 3.8.8 support $position operator?

南楼画角 提交于 2019-12-20 04:55:44

问题


Does Moongoose 3.8.8 (the lastest version) support $position (http://docs.mongodb.org/manual/reference/operator/update/position/) operator from MongoDB 2.6.0?

In the following code example the new elements is inserted in the end of the array userActivity.activities:

model:

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

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

query:

var activity = { act: 1 };

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

回答1:


This actually doesn't matter and never matters for any "framework" implementation and I do not mind explaining why.

Every single "framework" ( such as Mongoose, Mongoid, Doctrine, MongoEngine, etc, etc, etc ) are all basically built upon a basic "driver" implementation that has in most cases been developedby the MongoDB staff themselves. So the basic functionality is always ther even if you need to "delve" down to a level in order to use those "native" methods.


So here would be the native usage example in this case:

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

});

Note the "collection" method used from the model, which is getting the "raw" collection details from the driver. So you are using it's method and not some "wrapped" method that may be doing additional processing.


The next and most basic reason is if you cannot find the method and application of the operators that you need the here is a simple fact.

Every single operation as used by the methods in every framework and basic driver method is essentially a call to the "runCommand" method in the basic API. So since that basic call is available everywhere ( in some form or another, because it has to be ), then you can do everything that you find advertised on the MongoDB site with every language implementation on any framework.

But the short call to your particular request is, since this is not actually a method call but is simply part of the BSON arguments as passed in, then of course there is no restriction by a particular language driver to actually use this.

So you can use these new argument without of course updating to the most recent version. But you probably will get some nice methods to do so if you actually do.




回答2:


Yes, you should be able to use it directly as Mongoose will pass through the update clause:

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

The above would insert the values 1, 2, 3 at the front of the array named yourArrayField.

As it's just a pass-through, you'll need to make sure it works with the server version that you're connecting the client to.



来源:https://stackoverflow.com/questions/23063387/does-moongoose-3-8-8-support-position-operator

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!