4

我想知道我做错了什么。

我使用 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 类型转换问题

4

3 回答 3

11

如果你想使用 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) {
});

您可以将 mongo-native-driver 添加到您的应用程序中npm install mongodb --save

于 2014-09-06T14:14:37.953 回答
10

如果你使用sailsjs,那么:

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

:)

rernandez@itemsoft.mx

于 2014-10-30T01:31:34.000 回答
0

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

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

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

beforeCreate: function(values, cb) {

    cb();
}
于 2015-10-28T10:20:16.490 回答