Sails with Mongo中的本机更新不适用于ObjectId

时间:2014-09-06 10:04:42

标签: mongodb sails.js objectid

我想知道我做错了什么。

我使用Sailsv0.10和mongo2.6.0并希望通过native更新集合中的数组字段(使用$ push)。

我的模特:

module.exports = {

schema: true,
attributes: {

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

我的功能:

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

它到目前为止有效。但是为什么这不能用作id字段的查询?

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

我肯定会使用正确的ID来进行测试。

我做错了什么?或者是Sails-Mongo适配器的ObjectId类型转换问题

3 个答案:

答案 0 :(得分:10)

如果您想使用native(),您可以直接在mongo-DB中尝试相同的查询。因为_id是一个Object-id,你应该

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

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

您可以使用npm install mongodb --save

将mongo-native-driver添加到您的应用中

答案 1 :(得分:10)

如果您使用sailsjs:

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

:)

rhernandez@itemsoft.mx

答案 2 :(得分:0)

问题是因为,在mongo关系字段中,数据存储为字符串 - 但应该作为ObjectID,例如, ObjectID("56309f327dc5a4133c54bd5e")。我试图在beforeCreate()函数

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

但是它会抛出错误"传入的参数必须是12个字节的单个字符串或24个十六进制字符的字符串new ObjectId"。 我有sails-mongo 0.11.2。然后,我试图更新 - 这对我有帮助。所以检查你的sails-mongo版本。不要忘记从beforeCreate()中删除手动生成ObjectID,它将自行处理

beforeCreate: function(values, cb) {

    cb();
}