在发出之前从MongoDB更新结果

时间:2016-10-19 10:36:32

标签: mongodb mongoose socket.io

说我有这个查询

var query1 = usersrec.find({username:target}, {});
query1.exec(function (err, docs){
    if(err) throw ;
});

并且它给出了这个结果

{ 
    "_id" : ObjectId("5806ba413202e30d68152aa4"), 
    "username" : "sammy", 
    "firstname" : "samuel", 
    "lastname" : "jackson", 
    "gender" : "male", 
    "phone" : "0123456789", 
    "image" : "sam.jpg"
}

我希望在使用socket.io发布之前,将从另一个集合{"Balance" : "1011"}中获取的值添加到此结果文档中。

我尝试了很多事情并且遇到了错误,但是这样做却没有添加余额键/值:

docs[0].balance = '1011';
console.log(docs);
socket.emit('usernames', docs);

该文件仍保留其初始值。我错过了什么?

1 个答案:

答案 0 :(得分:0)

好像你使用的是Mongoose,Mongoose documents不允许添加属性。您需要在 exec() 之前调用lean()方法,因为启用了精益选项的查询返回的文档是普通的javascript对象:

来自文档:

var query1 = usersrec.find({username:target}, {});
query1.lean().exec(function (err, docs) {
    docs[0] instanceof mongoose.Document // false
});

所以你的代码应该是这样的:

var query1 = usersrec.find({username:target}, {});
query1.lean().exec(function (err, docs){
    if(err) throw ;
    docs[0].balance = '1011';
    console.log(docs);
    socket.emit('usernames', docs);
});

或将返回的文档强制转换为普通对象:

var query1 = usersrec.find({username:target}, {});
query1.exec(function (err, docs){
    if(err) throw ;
    docs = docs.map(function(o){ return o.toObject(); });
    docs[0].balance = '1011';
    console.log(docs);
    socket.emit('usernames', docs);
});