native update in Sails with Mongo does not work with ObjectId

落爺英雄遲暮 提交于 2019-11-28 08:33:10

问题


I wonder what I am doing wrong.

I use Sailsv0.10 and mongo2.6.0 and want to update an array field (using $push) in a collection via native.

My model:

module.exports = {

schema: true,
attributes: {

  username: {
    type: 'string',
    required: true
  },
  pubs: {
    type: 'array',
    defaultsTo: []
  },
  ...

My function:

    User.native(function (err, collection) {
      collection.update({username:aUsernameVariable},{$push:{pubs:aPubsVariable}}, function (err) {
    });

It works so far. But why does that not work as a query with the id field?

    User.native(function (err, collection) {
      collection.update({id:anIdVariable},{$push:{pubs:aPubsVariable}}, function (err) {
    });

I definately use the right id for the query to test it.

What am I doing wrong? Or is that a ObjectId type conversion Problem of the Sails-Mongo Adapter


回答1:


If you want to use native() you can always try the same query directly in your mongo-DB. Because _id is a Object-id you should

var ObjectId = require('mongodb').ObjectID;

 User.native(function (err, collection) {
  collection.update({_id: new ObjectId(anIdVariable)},{$push:{pubs:aPubsVariable}}, function (err) {
});

You can add the mongo-native-driver to you app with npm install mongodb --save




回答2:


if you use sailsjs then:

ObjectID = require('sails-mongo/node_modules/mongodb').ObjectID;
var o_id = new ObjectID(req.param('id'));
console.log(o_id );

:)

rhernandez@itemsoft.mx




回答3:


The problem is because, in mongo relation field, data stores as string - but should be as ObjectID, e.g. ObjectID("56309f327dc5a4133c54bd5e"). I've tried to generate ObjectID in beforeCreate() function

beforeCreate: function(values, cb) {
    var ObjectID = require('mongodb').ObjectID;
    values.owner = ObjectID(values.owner);
    cb();
}

But it throw an error "Argument passed in must be a single String of 12 bytes or a string of 24 hex characters new ObjectId". I had sails-mongo 0.11.2. Then I'v tried to update - and it helped to me. So check your sails-mongo version. Do not forget to remove manual generating ObjectID from beforeCreate() it will deals by itself

beforeCreate: function(values, cb) {

    cb();
}


来源:https://stackoverflow.com/questions/25699097/native-update-in-sails-with-mongo-does-not-work-with-objectid

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