MongoDB updateOne with upsert 不插入文档
MongoDB updateOne with upsert not inserting document
我有一个 nodejs Discord 机器人正在尝试 update/insert mongodb (v4.2.2) 中的文档。我已经这样做了很多次,但由于某种原因,这个特定的功能不起作用,我找不到我的错误。
quit: async function ( memberId ) {
console.log (memberId) //checks out
let member = await client.db('players').collection('suspensions').findOne({ _id: memberId })
console.log(member) //null
if ( !member ) {
console.log('member not found') //i see this, so I know it's trying
try {
client.db('players').collection('suspensions').updateOne(
{ _id: memberId },
{
$set: {
"quit.tier": 0,
"minor.tier": 0,
"moderate.tier": 0,
"major.tier": 0,
suspended: 0,
quitter: 0
}
},
{
$currentDate: {
ends: true,
}
},
{ upsert: true }).then( (err, results) => {
console.log('in callback') //i see this, so I know it's getting here
if (err) console.log(err) //see error below
console.log(results) //undefined
return
}
)
}
catch ( e ) {
console.log (e) //never gets here
return;
}
}
}
错误输出:
CommandResult {
result: { n: 0, nModified: 0, ok: 1 },
connection: Connection {
_events: [Object: null prototype] {
commandStarted: [Function (anonymous)],
commandFailed: [Function (anonymous)],
commandSucceeded: [Function (anonymous)],
clusterTimeReceived: [Function (anonymous)]
},
_eventsCount: 4,
_maxListeners: undefined,
id: 1,
address: '127.0.0.1:27017',
bson: BSON {},
socketTimeout: 360000,
monitorCommands: false,
closed: false,
destroyed: false,
lastIsMasterMS: 1,
[Symbol(kCapture)]: false,
[Symbol(description)]: StreamDescription {
address: '127.0.0.1:27017',
type: 'Standalone',
minWireVersion: 0,
maxWireVersion: 8,
maxBsonObjectSize: 16777216,
maxMessageSizeBytes: 48000000,
maxWriteBatchSize: 100000,
compressors: []
},
[Symbol(generation)]: 0,
[Symbol(lastUseTime)]: 1589941704648,
[Symbol(queue)]: Map(0) {},
[Symbol(messageStream)]: MessageStream {
_readableState: [ReadableState],
readable: true,
_events: [Object: null prototype],
_eventsCount: 7,
_maxListeners: undefined,
_writableState: [WritableState],
writable: true,
allowHalfOpen: true,
bson: BSON {},
maxBsonMessageSize: 67108864,
[Symbol(kCapture)]: false,
[Symbol(buffer)]: [BufferList]
},
[Symbol(stream)]: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: 'localhost',
_readableState: [ReadableState],
readable: true,
_events: [Object: null prototype],
_eventsCount: 7,
_maxListeners: undefined,
_writableState: [WritableState],
writable: true,
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: null,
_server: null,
timeout: 360000,
_peername: [Object],
[Symbol(asyncId)]: 229,
[Symbol(kHandle)]: [TCP],
[Symbol(kSetNoDelay)]: true,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: Timeout {
_idleTimeout: 360000,
_idlePrev: [TimersList],
_idleNext: [Timeout],
_idleStart: 5042,
_onTimeout: [Function: bound ],
_timerArgs: undefined,
_repeat: null,
_destroyed: false,
[Symbol(refed)]: false,
[Symbol(asyncId)]: 243,
[Symbol(triggerId)]: 229
},
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(kCapture)]: false,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0
},
[Symbol(ismaster)]: {
ismaster: true,
maxBsonObjectSize: 16777216,
maxMessageSizeBytes: 48000000,
maxWriteBatchSize: 100000,
localTime: 2020-05-20T02:28:24.642Z,
logicalSessionTimeoutMinutes: 30,
connectionId: 2794,
minWireVersion: 0,
maxWireVersion: 8,
readOnly: false,
ok: 1
}
},
message: BinMsg {
parsed: true,
raw: <Buffer 3c 00 00 00 0b 37 04 00 08 00 00 00 dd 07 00 00 00 00 00 00 00 27 00 00 00 10 6e 00 00 00 00 00 10 6e 4d 6f 64 69 66 69 65 64 00 00 00 00 00 01 6f 6b ... 10 more bytes>,
data: <Buffer 00 00 00 00 00 27 00 00 00 10 6e 00 00 00 00 00 10 6e 4d 6f 64 69 66 69 65 64 00 00 00 00 00 01 6f 6b 00 00 00 00 00 00 00 f0 3f 00>,
bson: BSON {},
opts: { promoteLongs: true, promoteValues: true, promoteBuffers: false },
length: 60,
requestId: 276235,
responseTo: 8,
opCode: 2013,
fromCompressed: undefined,
responseFlags: 0,
checksumPresent: false,
moreToCome: false,
exhaustAllowed: false,
promoteLongs: true,
promoteValues: true,
promoteBuffers: false,
documents: [ [Object] ],
index: 44
},
modifiedCount: 0,
upsertedId: null,
upsertedCount: 0,
matchedCount: 0
}
请注意,我能够 运行 来自 mongo UI 的类似 updateOne 命令,它插入得很好:
> use players
switched to db players
> db.suspensions.updateOne({ _id: '313389427671957504' }, { $set: { "quit.tier": 0, "minor.tier": 0,"moderate.tier": 0,"major.tier": 0,suspended: 0,quitter: 0 } }, { upsert: true })
{
"acknowledged" : true,
"matchedCount" : 0,
"modifiedCount" : 0,
"upsertedId" : "313389427671957504"
}
> db.suspensions.find()
{ "_id" : "313389427671957504", "major" : { "tier" : 0 }, "minor" : { "tier" : 0 }, "moderate" : { "tier" : 0 }, "quit" : { "tier" : 0 }, "quitter" : 0, "suspended" : 0 }```
updateOne函数的参数是(查询文档,更新文档,选项文档,回调函数)。
在提供的代码中的 updateOne 调用中,您有 4 个参数,但其中 2 个是更新文档。尝试将它们组合成一个文档,例如:
client.db('players').collection('suspensions').updateOne(
{ _id: memberId },
{
$set: {
"quit.tier": 0,
"minor.tier": 0,
"moderate.tier": 0,
"major.tier": 0,
suspended: 0,
quitter: 0
},
$currentDate: {
ends: true,
}
},
{ upsert: true })
$current_date 和 $set 运算符将出现在查询中的同一个对象中,在您的查询中,您将它们放在 2 个不同的对象中
下面是工作代码
quit: async function ( memberId ) {
console.log (memberId) //checks out
let member = await client.db('players').collection('suspensions').findOne({ _id: memberId })
console.log(member) //null
if ( !member ) {
console.log('member not found') //i see this, so I know it's trying
try {
client.db('players').collection('suspensions').updateOne(
{ _id: memberId },
{
$currentDate: {
ends: true,
},
$set: {
"quit.tier": 0,
"minor.tier": 0,
"moderate.tier": 0,
"major.tier": 0,
suspended: 0,
quitter: 0
}
},
{ upsert: true }).then( (err, results) => {
console.log('in callback') //i see this, so I know it's getting here
if (err) console.log(err) //see error below
console.log(results) //undefined
return
}
)
}
catch ( e ) {
console.log (e) //never gets here
return;
}
}
}
我有一个 nodejs Discord 机器人正在尝试 update/insert mongodb (v4.2.2) 中的文档。我已经这样做了很多次,但由于某种原因,这个特定的功能不起作用,我找不到我的错误。
quit: async function ( memberId ) {
console.log (memberId) //checks out
let member = await client.db('players').collection('suspensions').findOne({ _id: memberId })
console.log(member) //null
if ( !member ) {
console.log('member not found') //i see this, so I know it's trying
try {
client.db('players').collection('suspensions').updateOne(
{ _id: memberId },
{
$set: {
"quit.tier": 0,
"minor.tier": 0,
"moderate.tier": 0,
"major.tier": 0,
suspended: 0,
quitter: 0
}
},
{
$currentDate: {
ends: true,
}
},
{ upsert: true }).then( (err, results) => {
console.log('in callback') //i see this, so I know it's getting here
if (err) console.log(err) //see error below
console.log(results) //undefined
return
}
)
}
catch ( e ) {
console.log (e) //never gets here
return;
}
}
}
错误输出:
CommandResult {
result: { n: 0, nModified: 0, ok: 1 },
connection: Connection {
_events: [Object: null prototype] {
commandStarted: [Function (anonymous)],
commandFailed: [Function (anonymous)],
commandSucceeded: [Function (anonymous)],
clusterTimeReceived: [Function (anonymous)]
},
_eventsCount: 4,
_maxListeners: undefined,
id: 1,
address: '127.0.0.1:27017',
bson: BSON {},
socketTimeout: 360000,
monitorCommands: false,
closed: false,
destroyed: false,
lastIsMasterMS: 1,
[Symbol(kCapture)]: false,
[Symbol(description)]: StreamDescription {
address: '127.0.0.1:27017',
type: 'Standalone',
minWireVersion: 0,
maxWireVersion: 8,
maxBsonObjectSize: 16777216,
maxMessageSizeBytes: 48000000,
maxWriteBatchSize: 100000,
compressors: []
},
[Symbol(generation)]: 0,
[Symbol(lastUseTime)]: 1589941704648,
[Symbol(queue)]: Map(0) {},
[Symbol(messageStream)]: MessageStream {
_readableState: [ReadableState],
readable: true,
_events: [Object: null prototype],
_eventsCount: 7,
_maxListeners: undefined,
_writableState: [WritableState],
writable: true,
allowHalfOpen: true,
bson: BSON {},
maxBsonMessageSize: 67108864,
[Symbol(kCapture)]: false,
[Symbol(buffer)]: [BufferList]
},
[Symbol(stream)]: Socket {
connecting: false,
_hadError: false,
_parent: null,
_host: 'localhost',
_readableState: [ReadableState],
readable: true,
_events: [Object: null prototype],
_eventsCount: 7,
_maxListeners: undefined,
_writableState: [WritableState],
writable: true,
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: null,
_server: null,
timeout: 360000,
_peername: [Object],
[Symbol(asyncId)]: 229,
[Symbol(kHandle)]: [TCP],
[Symbol(kSetNoDelay)]: true,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: Timeout {
_idleTimeout: 360000,
_idlePrev: [TimersList],
_idleNext: [Timeout],
_idleStart: 5042,
_onTimeout: [Function: bound ],
_timerArgs: undefined,
_repeat: null,
_destroyed: false,
[Symbol(refed)]: false,
[Symbol(asyncId)]: 243,
[Symbol(triggerId)]: 229
},
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(kCapture)]: false,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0
},
[Symbol(ismaster)]: {
ismaster: true,
maxBsonObjectSize: 16777216,
maxMessageSizeBytes: 48000000,
maxWriteBatchSize: 100000,
localTime: 2020-05-20T02:28:24.642Z,
logicalSessionTimeoutMinutes: 30,
connectionId: 2794,
minWireVersion: 0,
maxWireVersion: 8,
readOnly: false,
ok: 1
}
},
message: BinMsg {
parsed: true,
raw: <Buffer 3c 00 00 00 0b 37 04 00 08 00 00 00 dd 07 00 00 00 00 00 00 00 27 00 00 00 10 6e 00 00 00 00 00 10 6e 4d 6f 64 69 66 69 65 64 00 00 00 00 00 01 6f 6b ... 10 more bytes>,
data: <Buffer 00 00 00 00 00 27 00 00 00 10 6e 00 00 00 00 00 10 6e 4d 6f 64 69 66 69 65 64 00 00 00 00 00 01 6f 6b 00 00 00 00 00 00 00 f0 3f 00>,
bson: BSON {},
opts: { promoteLongs: true, promoteValues: true, promoteBuffers: false },
length: 60,
requestId: 276235,
responseTo: 8,
opCode: 2013,
fromCompressed: undefined,
responseFlags: 0,
checksumPresent: false,
moreToCome: false,
exhaustAllowed: false,
promoteLongs: true,
promoteValues: true,
promoteBuffers: false,
documents: [ [Object] ],
index: 44
},
modifiedCount: 0,
upsertedId: null,
upsertedCount: 0,
matchedCount: 0
}
请注意,我能够 运行 来自 mongo UI 的类似 updateOne 命令,它插入得很好:
> use players
switched to db players
> db.suspensions.updateOne({ _id: '313389427671957504' }, { $set: { "quit.tier": 0, "minor.tier": 0,"moderate.tier": 0,"major.tier": 0,suspended: 0,quitter: 0 } }, { upsert: true })
{
"acknowledged" : true,
"matchedCount" : 0,
"modifiedCount" : 0,
"upsertedId" : "313389427671957504"
}
> db.suspensions.find()
{ "_id" : "313389427671957504", "major" : { "tier" : 0 }, "minor" : { "tier" : 0 }, "moderate" : { "tier" : 0 }, "quit" : { "tier" : 0 }, "quitter" : 0, "suspended" : 0 }```
updateOne函数的参数是(查询文档,更新文档,选项文档,回调函数)。
在提供的代码中的 updateOne 调用中,您有 4 个参数,但其中 2 个是更新文档。尝试将它们组合成一个文档,例如:
client.db('players').collection('suspensions').updateOne(
{ _id: memberId },
{
$set: {
"quit.tier": 0,
"minor.tier": 0,
"moderate.tier": 0,
"major.tier": 0,
suspended: 0,
quitter: 0
},
$currentDate: {
ends: true,
}
},
{ upsert: true })
$current_date 和 $set 运算符将出现在查询中的同一个对象中,在您的查询中,您将它们放在 2 个不同的对象中
下面是工作代码
quit: async function ( memberId ) {
console.log (memberId) //checks out
let member = await client.db('players').collection('suspensions').findOne({ _id: memberId })
console.log(member) //null
if ( !member ) {
console.log('member not found') //i see this, so I know it's trying
try {
client.db('players').collection('suspensions').updateOne(
{ _id: memberId },
{
$currentDate: {
ends: true,
},
$set: {
"quit.tier": 0,
"minor.tier": 0,
"moderate.tier": 0,
"major.tier": 0,
suspended: 0,
quitter: 0
}
},
{ upsert: true }).then( (err, results) => {
console.log('in callback') //i see this, so I know it's getting here
if (err) console.log(err) //see error below
console.log(results) //undefined
return
}
)
}
catch ( e ) {
console.log (e) //never gets here
return;
}
}
}