#node.js #mongodb #mongoose
Вопрос:
$and
Оператор в Мангусте неправильно работает в NodeJS. Давайте предположим, что у нас есть эти данные JSON-MongoDB:
{
"_id" : ObjectId("60bb4cd74a802722d8b0de0f"),
"username" : "System",
"text" : "matan has joined!",
"__v" : NumberInt(0)
}
{
"_id" : ObjectId("60bb4cd74a802722d8b0de10"),
"username" : "System",
"text" : "Welcome!",
"__v" : NumberInt(0)
}
{
"_id" : ObjectId("60bb4cdb4a802722d8b0de11"),
"username" : "matan",
"text" : "Hello World",
"__v" : NumberInt(0)
}
{
"_id" : ObjectId("60bb4ce14a802722d8b0de12"),
"username" : "System",
"text" : "matan has left.",
"__v" : NumberInt(0)
}
Я хочу отфильтровать данные, чтобы все System's Welcome
сообщения были удалены. Например, этот вывод будет показан:
{
"_id" : ObjectId("60bb4cd74a802722d8b0de0f"),
"username" : "System",
"text" : "matan has joined!",
"__v" : NumberInt(0)
}
{
"_id" : ObjectId("60bb4cdb4a802722d8b0de11"),
"username" : "matan",
"text" : "Hello World",
"__v" : NumberInt(0)
}
{
"_id" : ObjectId("60bb4ce14a802722d8b0de12"),
"username" : "System",
"text" : "matan has left.",
"__v" : NumberInt(0)
}
Но вместо этого отображается только этот вывод:
{
_id: 60bb4cdb4a802722d8b0de11,
username: 'matan',
text: 'Hello World',
__v: 0
}
Это мой код (NodeJS):
var msgs = Msg.find({
$and: [
{ username: {$ne: "System"} },
{ text: {$ne: "Welcome!"} }
]
}, (err, retn) => console.log(retn))
Я пропустил что-то важное? Спасибо за помощь.
Комментарии:
1. Я хочу отфильтровать данные, чтобы все приветственные сообщения Системы были удалены => почему >
$ne
? использовать$eq
.2. Мне нужны все данные, кроме приветствия системы.
3. просто используйте
$or
вместо$and
.4.
$or
не будет работать, потому что кто-то другой также может отправитьWelcome!
сообщение илиSystem
может отправить сообщение, которого нетWelcome!
.5. @NenadMilosavljevic он просто хочет исключить приветственное сообщение системы, $или не будет исключать другие приветственные сообщения. смотрите детскую площадку
Ответ №1:
$and
Условие с $ne
будет соответствовать тому, что оба поля не должны быть равны значению.
Вы можете просто попробовать $or
условие,
var msgs = Msg.find({
$or: [
{ username: { $ne: "System" } },
{ text: { $ne: " Welcome!" } }
]
}, (err, retn) => console.log(retn))
Ответ №2:
Вы можете использовать Конвейер агрегации:
$addFields
чтобы добавить новое полеflag
, которое будетtrue
, если будут выполнены оба требования (username
равноSystem
иtext
равноWelcome!
) илиfalse
иначе.$match
для фильтрации всех документов, в которых новое полеflag
равно false$project
чтобы удалить новое полеflag
из конечного результата
db.collection.aggregate([
{
"$addFields": {
"flag": {
"$cond": {
if: {
"$and": [
{
"$eq": [
"$username",
"System"
]
},
{
"$eq": [
"$text",
"Welcome!"
]
}
]
},
then: true,
else: false
}
}
}
},
{
"$match": {
"flag": false
}
},
{
"$project": {
"flag": 0
}
}
])
Вот рабочий пример: https://mongoplayground.net/p/ENDzUW8igJP
Ответ №3:
Вместо этого используйте оператор $или
var msgs = Msg.find({
$or: [
{ username: {$ne: "System"} },
{ text: {$ne: "Welcome!"} }
]
}, (err, retn) => console.log(retn))