【问题标题】:native update in Sails with Mongo does not work with ObjectId使用 Mongo 的 Sails 中的本机更新不适用于 ObjectId
【发布时间】:2014-09-06 10:04:41
【问题描述】:

我想知道我做错了什么。

我使用 Sailsv0.10 和 mongo2.6.0 并希望通过原生更新集合中的数组字段(使用 $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 Adapter 的 ObjectId 类型转换问题

【问题讨论】:

    标签: mongodb sails.js objectid


    【解决方案1】:

    如果你想使用 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 添加到您的应用程序中

    【讨论】:

    • 感谢您的回答。如果您的意思是以使用 mongo shell 的方式“直接在您的 mongo-DB 中查询”,那么会说我想从 Sails 控制器执行该命令。在 Sails 中,ObjectId 类型未知。 Id 在正常的 Sails 函数中得到内部转换,但显然不是在本机更新中。在原生 find 它也可以工作,但不能在原生更新中。
    • 抱歉,我忘了添加 mongodatabase-driver。我更新了我的解决方案!
    • 非常感谢!使用“var ObjectId ...”而不是“var ObjectID ...”它可以完美地工作。我猜它为我节省了一些索引。既然我是菜鸟,这样做有什么坏处吗?
    【解决方案2】:

    如果你使用sailsjs,那么:

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

    :)

    rernandez@itemsoft.mx

    【讨论】:

    • 这应该被接受,因为它使用了内置的依赖工具
    【解决方案3】:

    问题在于,在 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      相关资源
      最近更新 更多