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 に答える
0

問題は、mongo 関係フィールドでは、データが文字列として格納されるためですが、ObjectID として格納する必要がありますObjectID("56309f327dc5a4133c54bd5e")beforeCreate()関数で ObjectID を生成しようとしました

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

ただし、「渡された引数は、12 バイトの単一の文字列または 24 個の 16 進文字の新しい ObjectId の文字列である必要があります」というエラーがスローされます。私はセイルモンゴ0.11.2を持っていました。それから私は更新しようとしました-そしてそれは私を助けました. ですから、sails-mongo のバージョンを確認してください。手動で生成する ObjectID を beforeCreate() から削除することを忘れないでください。それ自体で処理されます。

beforeCreate: function(values, cb) {

    cb();
}
于 2015-10-28T10:20:16.490 に答える