1

Есть.

/* 0 */
{
    "_id" : ObjectId("541c03489c3009e80de19d6b"),
    "ts" : 1411121993,
    "close" : false,
    "users" : [ 
        "7e8f5f8fc847bc6", 
        "920299d58dc02ec"
    ],
    "__v" : 0
}

/* 1 */
{
    "_id" : ObjectId("541c035f9c3009e80de19d6c"),
    "ts" : 1411122016,
    "close" : false,
    "users" : [ 
        "7e8f5f8fc847bc6", 
        "a285496ba35fe98"
    ],
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("541c035f9c3009e80de19d6d"),
    "ts" : 1411122016,
    "close" : false,
    "users" : [ 
        "7e8f5f8fc847bc6", 
        "c2f1f4e949237d1"
    ],
    "__v" : 0
}

Это коллекция диалогов.

Допустим, мой id - 7e8f5f8fc847bc6.

Мне нужно создать новый диалог с пользователем id - c2f1f4e949237d1.

Для этого мне нужно проверить на существование такого диалога.

Если он уже существует и close: false, то нужно выдать его dialog id, если нет - создать новый.

Проблема в том, что я не пойму, как в mongoose сделать запрос проверки.

В массиве users данные могут быть в любом порядке, но их не может быть больше двух.

На языке sql это примерно вот так:

select ... where (users = ['c2f1f4e949237d1', '7e8f5f8fc847bc6'] or users = ['7e8f5f8fc847bc6', 'c2f1f4e949237d1']) and close = false
1
  • @ua6xh, спасибо!
    – Oleg
    19 сен 2014 в 14:25

1 ответ 1

1
> db.dialogs.find();
{ "_id" : ObjectId("541c03489c3009e80de19d6b"), "ts" : 1411121993, "close" : false, "users" : [ "7e8f5f8fc847bc6", "920299d58dc02ec" ], "__v" : 0 }
>
> db.dialogs.find({users:"7e8f5f8fc847bc6", users:"920299d58dc02ec", close:false});
{ "_id" : ObjectId("541c03489c3009e80de19d6b"), "ts" : 1411121993, "close" : false, "users" : [ "7e8f5f8fc847bc6", "920299d58dc02ec" ], "__v" : 0 }
>
>
> db.dialogs.find({users:"7e8f5f8fc847bc6", users:"920299d58dc02ec", close:false},{_id:1});
{ "_id" : ObjectId("541c03489c3009e80de19d6b") }
>

Upd2:

db.dialogs.find(
    {$and:[
        {users:"7e8f5f8fc847bc6hghg"}, 
        {users:"920299d58dc02ec"}, 
        {close:false}
    ]},
    {_id:1}
);
6
  • 1
    Потрясающе! Спасибо!
    – Oleg
    19 сен 2014 в 12:07
  • 1
    @exec, я думаю, надо будет делать составной индекс по (users, close). В любом случае стоит создать около 1 млн записей и проверить выборки с индексом и без. 19 сен 2014 в 12:12
  • @ua6xh, проверю, посмотрю. ___ @ua6xh, стоп. Это поиск не точный. Он ищет либо по одному, либо по другому. db.dialog.find({users: 'hjhj', users: '920299d58dc02ec'}); тоже найдет
    – Oleg
    19 сен 2014 в 12:19
  • @exec, обновил ответ по новым требованиям к запросу. Поиск проходит только по общему совпадению. 19 сен 2014 в 12:32
  • @ua6xh src.unotes.ru/g/dxpsy.png - это нормально. src.unotes.ru/g/p6z14.png - это тоже нормально. src.unotes.ru/g/ed3ni.png - нашло, хотя не должно было. Может быть, у вас не находит из-за того, что один документ в коллекции?
    – Oleg
    19 сен 2014 в 12:56

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.