说我有这个查询
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);
该文件仍保留其初始值。我错过了什么?
答案 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);
});