#node.js #mongodb
#node.js #mongodb
Вопрос:
Я пытался добавить электронные письма (это новое поле) в мою коллекцию «люди», но я не знаю, почему я не получаю результатов от сервера. Это мой код
for (key in D_emails) {
console.log(D_emails[key])
try {
o_id = new mongo.ObjectID(D_emails[key])
collection.updateOne({
_id: o_id
}, {
$set: {
"Email": key
}
}, function(err, results) {
if (err) {
throw err
} else if (results.length) {
console.log(results)
} else {
console.log("no results")
}
});
} catch (e) {
print(e);
}
}
Комментарии:
1. D_emails — это словарь с электронными письмами для его ключа и mongo documents _id для его значений. Я сделал это просто для того, чтобы убедиться, что в электронных письмах нет дублирования.
2. какова ценность
results
?
Ответ №1:
Согласно документации mongo для updateOne, ответ на запрос ( results
в вашем случае) не содержит элемента length и не является массивом или объектом. Это будет ответ в соответствии с документацией:
Возвращает документ, содержащий:
- Логическое значение, подтвержденное как true, если операция выполнялась с проблемой записи или false, если проблема записи была отключена
- matchedCount, содержащий количество сопоставленных документов
- Измененный подсчет количества измененных документов с повышенным идентификатором, содержащим _id для
- обновленный документ
Ответ №2:
прежде всего. попробуйте кодировать без блоков try catch при использовании концепции объекта «err», возвращаемого при каждом асинхронном обратном вызове. Вы можете обработать ошибку прямо внутри обратного вызова. «выбрасывание» ошибки также предотвратит обновление других электронных писем. Но, может быть, это то, что вы хотите. Сейчас это не имеет большого значения.
Теперь вернемся к вашему вопросу. позвольте мне показать вам, что result
в этом примере:
// inserting.
collection.insertOne({_id: "lala", a:10, b:20}, function (err, r) {
assert.equal(null, err);
assert.equal(1, r.insertedCount);
// updating.
collection.updateOne({_id: "lala"}, {$set: {a: 99}}, {}, function(err, result) {
assert.equal(null, err);
console.log(result) // first thing printed.
console.log(JSON.stringify(result, null, "t")) // second print.
// checking whats inside it.
collection.findOne({_id: "lala"}, {}, function(err, doc) {
assert.equal(null, err);
console.log(doc) // third print.
db.close() // don't close connection if you don't need to.
})
})
})
будут напечатаны 3 вещи (прокрутите до конца, чтобы увидеть, что вы на самом деле хотите):
CommandResult {
result: { ok: 1, nModified: 1, n: 1 },
connection:
Connection {
domain: null,
_events:
{ close: [Object],
error: [Object],
timeout: [Object],
parseError: [Object],
connect: [Function] },
_eventsCount: 5,
_maxListeners: undefined,
options:
{ socketOptions: {},
auto_reconnect: true,
host: 'localhost',
port: 27017,
cursorFactory: [Object],
reconnect: true,
emitError: true,
size: 5,
disconnectHandler: [Object],
bson: BSON {},
messageHandler: [Function],
wireProtocolHandler: [Object] },
id: 1,
logger: Logger { className: 'Connection' },
bson: BSON {},
tag: undefined,
messageHandler: [Function],
maxBsonMessageSize: 67108864,
port: 27017,
host: 'localhost',
keepAlive: true,
keepAliveInitialDelay: 0,
noDelay: true,
connectionTimeout: 0,
socketTimeout: 0,
destroyed: false,
domainSocket: false,
singleBufferSerializtion: true,
serializationFunction: 'toBinUnified',
ca: null,
cert: null,
key: null,
passphrase: null,
ssl: false,
rejectUnauthorized: false,
checkServerIdentity: true,
responseOptions: { promoteLongs: true },
flushing: false,
queue: [],
connection:
Socket {
connecting: false,
_hadError: false,
_handle: [Object],
_parent: null,
_host: 'localhost',
_readableState: [Object],
readable: true,
domain: null,
_events: [Object],
_eventsCount: 8,
_maxListeners: undefined,
_writableState: [Object],
writable: true,
allowHalfOpen: false,
destroyed: false,
_bytesDispatched: 334,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: null,
_server: null,
_idleNext: null,
_idlePrev: null,
_idleTimeout: -1,
read: [Function],
_consuming: true },
writeStream: null,
hashedName: '29bafad3b32b11dc7ce934204952515ea5984b3c',
buffer: null,
sizeOfMessage: 0,
bytesRead: 0,
stubBuffer: null },
matchedCount: 1,
modifiedCount: 1,
upsertedId: null,
upsertedCount: 0 }
{
"ok": 1,
"nModified": 1,
"n": 1
}
{ _id: 'lala', a: 99, b: 20 }
первый объект — это result
возвращаемый из «updateOne ()».
второй объект result
— это реализация «toString ()», и это то, что находится внутри result.result
(прокрутите назад к началу).
последний объект — это то, что я получаю после запроса обновленного документа.
вы можете найти больше примеров на собственном драйвере mongodb для веб-сайта nodejs: http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#updateOne их полно примеров.