MongoDB.find包含多个$or语句,语法错误为“意外令牌]”?
用户可以发送或接收消息,并且应该能够对其消息进行归档 因此,此.find应返回userA位于to.username或from.username中的所有文档,并带有view.archive:true。从这里开始,第二个$or应该过滤第一个$or的结果,以便只包括消息值为1:true、value.2:true或value.3:true的匹配文档 但是,现在有SyntaxError:Unexpected token]用于第一个$or上的[closing]MongoDB.find包含多个$or语句,语法错误为“意外令牌]”?,mongodb,mongoose,Mongodb,Mongoose,用户可以发送或接收消息,并且应该能够对其消息进行归档 因此,此.find应返回userA位于to.username或from.username中的所有文档,并带有view.archive:true。从这里开始,第二个$or应该过滤第一个$or的结果,以便只包括消息值为1:true、value.2:true或value.3:true的匹配文档 但是,现在有SyntaxError:Unexpected token]用于第一个$or上的[closing] Models.Messages.find(
Models.Messages.find(
{
"$or" : [
{
"to": {
"$elemMatch": {
"username": 'userA',
"view.archive": true,
"view.bin": true
}
}
},
{
"from" : {
"$elemMatch" : {
"username" : 'userA',
"view.archive": true,
"view.bin": true
}
}
}
],
"$or": [
{ 'value.1': true },
{ 'value.2': true },
{ 'value.3': true },
{ 'value.4': false }
]
}
).sort([['updated','descending']]).exec(function (err, messages) {
应为userA找到这两条消息:
{
"_id" : ObjectId("53e83867f316ea7f22fd3b2b"),
"updated" : ISODate("2014-08-11T03:29:06.000Z"),
"message" : "message1",
"value" : [
"1" : true,
"2" : false,
"3" : false,
"4" : false
]
"to" : [
{
"user" : ObjectId("53e835bd76e0d04318d8cc4e"),
"username" : "userA",
"_id" : ObjectId("53e83867f316ea7f22fd3b2c"),
"view" : {
"inbox" : false,
"outbox" : false,
"archive" : true,
"bin" : false
}
}
],
"from" : [
{
"user" : ObjectId("53e8360276e0d04318d8cc55"),
"username" : "userB",
"_id" : ObjectId("53e83867f316ea7f22fd3b2d"),
"view" : {
"inbox" : false,
"outbox" : true,
"archive" : false,
"bin" : false
}
}
],
"__v" : 5
}
{
"_id" : ObjectId("53e83867f316ea7f22fd3b2b"),
"updated" : ISODate("2014-08-11T03:29:06.000Z"),
"message" : "message2",
"value" : [
"1" : false,
"2" : true,
"3" : false,
"4" : false
]
"to" : [
{
"user" : ObjectId("53e8360276e0d04318d8cc55"),
"username" : "userB",
"_id" : ObjectId("53e83867f316ea7f22fd3b2c"),
"view" : {
"inbox" : true,
"outbox" : false,
"archive" : false,
"bin" : false
}
}
],
"from" : [
{
"user" : ObjectId("53e835bd76e0d04318d8cc4e"),
"username" : "userA",
"_id" : ObjectId("53e83867f316ea7f22fd3b2d"),
"view" : {
"inbox" : false,
"outbox" : true,
"archive" : true,
"bin" : false
}
}
],
"__v" : 5
}
感谢@johnyhk对的回答,因为它也适用于这里 在MongoDB中,$and被暗示为.find,但当组合$or过滤器时,它似乎是必要的,@soulcheck也指出了这一点
Models.Messages.find(
{
$and: [{
"$or" : [
{
"to": {
"$elemMatch": {
"username": 'userA',
"view.archive": true,
"view.bin": false
}
}
},
{
"from" : {
"$elemMatch" : {
"username" : 'userA',
"view.archive": true,
"view.bin": false
}
}
}
]}, {
"$or": [
{ 'value.1': true },
{ 'value.2': true },
{ 'value.3': true },
{ 'value.4': false }
]
}
]
}
).sort([['updated','descending']]).exec(function (err, messages) {
您忘记添加$,但在$或筛选器之前,您仍然错误地使用了多个$或字段,就像在您的应用程序中一样。我的回答没有道理吗?@johnyhk你的回答完全有道理。谢谢你。结果仍然不包括结果中的美元,因此可能还有其他原因。。所以我决定尝试一个.find,但我认为$and是隐含的。find@soulcheck感谢您指出..给人的印象是$and包含在.find中