在mongoose中推送到子文档中的数组

时间:2022-12-29 21:25:51

I'd like to push to an array that's within a subdocument in Mongoose/MongoDB.

我想推送到Mongoose / MongoDB的子文档中的数组。

Here is the schema:

这是架构:

var UsersSchema = new mongoose.Schema({
    user: String,
    stream: String,
    author: String,
    tags: Array,
    thumb: Number,
    added: Number
})

var ContentSchema = new mongoose.Schema( {
    title: String,
    url: String,
    description: String,
    text: String,
    users: [ UsersSchema ]  
})

I'd like to push an array into the UserSchema.tags array for a specific users sub-document.

我想将一个数组推送到UserSchema.tags数组中以获取特定用户子文档。

I have tried this and several variations: https://*.com/a/19901207/2183008

我试过这个和几个变种:​​https://*.com/a/19901207/2183008


By default, my front-end Angular app is sending the tags as an array of objects. So it's

默认情况下,我的前端Angular应用程序将标记作为对象数组发送。所以就是

[ { 'text': TAG_STRING_HERE } ]

or

[ { 'text': TAG_STRING_HERE }, { 'text': TAG2_STRING_HERE } ]

But I've also tried just using and array of strings, which I'm fine doing if objects are a problem for some reason.

但我也尝试过使用和字符串数组,如果对象因某些原因出现问题,我很乐意这样做。


I have tried this:

我试过这个:

var tags = req.body.tags,
    contentId = mongoose.Types.ObjectId( req.body.id )

Content.update( 
    { 'users._id': contentId },
    { $push: { 'users.tags': { $each: tags } } }
).exec()
.then( function ( result ) { 
    console.log( result )
    resolve( result )
}, function ( error ) {
    if ( error ) return reject( error )
})

Which gives me this error:

这给了我这个错误:

{ [MongoError: cannot use the part (users of users.tags) to traverse the element ({users: [ { user: "54f6688c55407c0300b883f2", added: 1428080209443.0, stream: "watch", _id: ObjectId('551ec65125927f36cf4c04e9'), tags: [] }, { user: "54f6688c55407c0300b883f2", added: 1428080222696.0, stream: "listen", _id: ObjectId('551ec65e25927f36cf4c04ea'), tags: [] } ]})]
name: 'MongoError',
code: 16837,
err: 'cannot use the part (users of users.tags) to traverse the element ({users: [ { user: "54f6688c55407c0300b883f2", added: 1428080209443.0, stream: "watch", _id: ObjectId(\'551ec65125927f36cf4c04e9\'), tags: [] }, { user: "54f6688c55407c0300b883f2", added: 1428080222696.0, stream: "listen", _id: ObjectId(\'551ec65e25927f36cf4c04ea\'), tags: [] } ]})' }

1 个解决方案

#1


0  

The solution is below. Note this is using Q and Express. The part of note is the 'users.$.tags. I thought I had tried this but I guess not! I also used $pushAll instead, but $each might also work. My tags is always an array.

解决方案如下。请注意,这是使用Q和Express。注释的一部分是'users。$。标签。我以为我试过这个,但我猜不是!我也使用了$ pushAll,但$ each也可以。我的标签总是一个数组。

var tags = req.body.tags,
    contentId = mongoose.Types.ObjectId( req.body.id )

console.log( tags )

Content.update( 
    { 'users._id': contentId },
    { $pushAll: { 'users.$.tags': tags } }
).exec()
.then( function ( result ) { 
    console.log( result )
    resolve( result )
}, function ( error ) {
    if ( error ) return reject( error )
})

#1


0  

The solution is below. Note this is using Q and Express. The part of note is the 'users.$.tags. I thought I had tried this but I guess not! I also used $pushAll instead, but $each might also work. My tags is always an array.

解决方案如下。请注意,这是使用Q和Express。注释的一部分是'users。$。标签。我以为我试过这个,但我猜不是!我也使用了$ pushAll,但$ each也可以。我的标签总是一个数组。

var tags = req.body.tags,
    contentId = mongoose.Types.ObjectId( req.body.id )

console.log( tags )

Content.update( 
    { 'users._id': contentId },
    { $pushAll: { 'users.$.tags': tags } }
).exec()
.then( function ( result ) { 
    console.log( result )
    resolve( result )
}, function ( error ) {
    if ( error ) return reject( error )
})