Javascript 使用findOneAndUpdate$pull and populate不会更新或填充

Javascript 使用findOneAndUpdate$pull and populate不会更新或填充,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,这是我的数据: { "_id" : ObjectId("594e762b03cc52508686ceef"), "_members" : [ "59527bd5e521801bf07eab98", "594ecca47a699d1775c2a2db" ], } const UserSchema = new Schema({ // ... posts : [{ type: Schema.Types.ObjectId, r

这是我的数据:

{
    "_id" : ObjectId("594e762b03cc52508686ceef"),
    "_members" : [ 
        "59527bd5e521801bf07eab98", 
        "594ecca47a699d1775c2a2db"
    ],
}
const UserSchema = new Schema({
    // ...
    posts : [{ type: Schema.Types.ObjectId, ref: 'post' }],
    // ...
})
let id = mongoose.mongo.ObjectID(req.params.id)
let member = mongoose.mongo.ObjectID(req.params.member)
let populateQuery = [
    {path:'_members', select:'_id'}
]

Post.
findOneAndUpdate(
    {'_id' : id} ,
    {
       $pull: { '_members': { '_id': member }}
     },
     {'new': true}
).
populate(populateQuery).
exec(
  function (err, data) {
    res.send(data)
  }
);
我想从
成员中删除
59527bd5e521801bf07eab98

PostSchema:

const PostsSchema = new Schema({
    // ...
    _members: [{ type: Schema.Types.ObjectId, ref: 'user' }],
    // ...
})
UserSchema:

{
    "_id" : ObjectId("594e762b03cc52508686ceef"),
    "_members" : [ 
        "59527bd5e521801bf07eab98", 
        "594ecca47a699d1775c2a2db"
    ],
}
const UserSchema = new Schema({
    // ...
    posts : [{ type: Schema.Types.ObjectId, ref: 'post' }],
    // ...
})
let id = mongoose.mongo.ObjectID(req.params.id)
let member = mongoose.mongo.ObjectID(req.params.member)
let populateQuery = [
    {path:'_members', select:'_id'}
]

Post.
findOneAndUpdate(
    {'_id' : id} ,
    {
       $pull: { '_members': { '_id': member }}
     },
     {'new': true}
).
populate(populateQuery).
exec(
  function (err, data) {
    res.send(data)
  }
);
查找和更新:

{
    "_id" : ObjectId("594e762b03cc52508686ceef"),
    "_members" : [ 
        "59527bd5e521801bf07eab98", 
        "594ecca47a699d1775c2a2db"
    ],
}
const UserSchema = new Schema({
    // ...
    posts : [{ type: Schema.Types.ObjectId, ref: 'post' }],
    // ...
})
let id = mongoose.mongo.ObjectID(req.params.id)
let member = mongoose.mongo.ObjectID(req.params.member)
let populateQuery = [
    {path:'_members', select:'_id'}
]

Post.
findOneAndUpdate(
    {'_id' : id} ,
    {
       $pull: { '_members': { '_id': member }}
     },
     {'new': true}
).
populate(populateQuery).
exec(
  function (err, data) {
    res.send(data)
  }
);
有趣的是,“总体”似乎只通过在本例中指定
model
选项来起作用

此外,您只需将
成员
直接提供给
$pull
,因为
\u id
在“填充”之前实际上不是属性。
“\u members”
数组只是
Post
本身中
ObjectId
值的数组。因此,直接提供输入:

Post.findOneAndUpdate(
  {'_id' : id} ,
  {
    $pull: { '_members': member }
  },
  {'new': true}
)
.populate({path:'_members', select:'_id', model: 'user' })
.exec(function(err,post) {
  if (err) throw err; // or something
  res.send(post)
})
还是有承诺

Post.findOneAndUpdate(
  {'_id' : id} ,
  {
    $pull: { '_members':  member }
  },
  {'new': true}
)
.populate({path:'_members', select:'_id', model: 'user' })
.then(post => res.send(post))
.catch(err => console.error(err));  // or something
交替调用:

或者交替使用承诺:

Post.findOneAndUpdate(
  {'_id' : id} ,
  {
    $pull: { '_members': member }
  },
  {'new': true}
)
.then(post => Post.populate(post, {path:'_members', select:'_id', model: 'user' }))
.then(post => res.send(post))      // also populated
.catch(err => console.error(err))    // or whichever
当您仅要求返回文档中已嵌入的
\u id
字段时,您不确定为什么要调用
.populate()
,但这是另一种情况。使用
模型
选项,人口实际上发生在这里


作为一个独立的演示:

const async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;

mongoose.Promise = global.Promise;
mongoose.set('debug',true);
mongoose.connect('mongodb://localhost/test');

const relSchema = new Schema({ c: String });
const testSchema = new Schema({
  a: String,
  b: [{ type: Schema.Types.ObjectId, rel: 'Rel' }]
})

const Test = mongoose.model('Test', testSchema);
const Rel = mongoose.model('Rel', relSchema);

function log(data) {
  console.log(JSON.stringify(data, undefined, 2))
}

async.series(
  [
    (callback) =>
      async.each(mongoose.models,(model,callback) =>
        model.remove({},callback),callback),

    (callback) =>
      async.waterfall(
        [

          (callback) => Rel.create([{ c: 2 },{ c: 3 },{ c: 4 }],callback),


          (rels,callback) => Test.create({ a: 1, b: rels },(err,test) => {
            if (err) callback(err);
            log(test);
            callback(err,test.b.slice(1,3))
          }),

          (rels,calback) =>
            Test.findOneAndUpdate(
              { 'a': 1 },
              { '$pull': { 'b': rels[0] } },
              { 'new': true }
            )
            .populate({ path: 'b', model: 'Rel' })
            .exec((err,test) => {
              if (err) callback(err);
              log(test);
              callback(err);
            })

        ],
        callback
      )

  ],
  (err) => {
    if (err) throw err;
    mongoose.disconnect();
  }
)
以及输出:

Mongoose: tests.remove({}, {})
Mongoose: rels.remove({}, {})
Mongoose: rels.insert({ c: '2', _id: ObjectId("595714579afd8860e56d2ec7"), __v: 0 })
Mongoose: rels.insert({ c: '3', _id: ObjectId("595714579afd8860e56d2ec8"), __v: 0 })
Mongoose: rels.insert({ c: '4', _id: ObjectId("595714579afd8860e56d2ec9"), __v: 0 })
Mongoose: tests.insert({ a: '1', _id: ObjectId("595714579afd8860e56d2eca"), b: [ ObjectId("595714579afd8860e56d2ec7"), ObjectId("595714579afd8860e56d2ec8"), ObjectId("595714579afd8860e56d2ec9") ], __v: 0 })
{
  "__v": 0,
  "a": "1",
  "_id": "595714579afd8860e56d2eca",
  "b": [
    "595714579afd8860e56d2ec7",
    "595714579afd8860e56d2ec8",
    "595714579afd8860e56d2ec9"
  ]
}
Mongoose: tests.findAndModify({ a: '1' }, [], { '$pull': { b: ObjectId("595714579afd8860e56d2ec8") } }, { new: true, upsert: false, remove: false, fields: {} })
Mongoose: rels.find({ _id: { '$in': [ ObjectId("595714579afd8860e56d2ec7"), ObjectId("595714579afd8860e56d2ec9") ] } }, { fields: {} })
{
  "_id": "595714579afd8860e56d2eca",
  "a": "1",
  "__v": 0,
  "b": [
    {
      "_id": "595714579afd8860e56d2ec7",
      "c": "2",
      "__v": 0
    },
    {
      "_id": "595714579afd8860e56d2ec9",
      "c": "4",
      "__v": 0
    }
  ]
}

提问时,请包括问题本身以及您看到的任何错误消息。不清楚什么对您不起作用:是连接问题,是客户端错误,语法错误,等等?@Eye本可以说得更清楚,但本例中的“错误”是
.populate()
调用没有执行它应该执行的操作并检索相关数据。这就是问题的关键所在。修改标题以反映this@user1788781你可以用你新学到的东西来感谢我